├── .gitignore ├── README.md ├── excalidraw ├── algo │ ├── bin-exp.excalidraw │ ├── bin-exp.png │ ├── binary-log-algo.excalidraw │ ├── binary-log-algo.png │ ├── dec-to-bin-algo.excalidraw │ ├── dec-to-bin-algo.png │ ├── fft.excalidraw │ ├── fft.png │ ├── most-significant-bit.excalidraw │ ├── most-significant-bit.png │ ├── twos-complement.excalidraw │ └── twos-complement.png ├── cpamm-arbitrage.excalidraw ├── cpamm-arbitrage.png ├── cpamm-spot-price-example.excalidraw ├── cpamm-spot-price-examples.png ├── cpamm-spot-price.excalidraw ├── cpamm-spot-price.png ├── cpamm.excalidraw ├── cpamm.png ├── csamm.excalidraw ├── csamm.png ├── dai-stability-fee.excalidraw ├── dai-stability-fee.png ├── discrete-staking-rewards.excalidraw ├── discrete-staking-rewards.png ├── ema-irregular-intervals.excalidraw ├── ema-irregular.png ├── ema.excalidraw ├── ema.png ├── erc1155.excalidraw ├── erc1155.png ├── gas-less-token-transfer.excalidraw ├── gas-less-token-transfer.png ├── geometric-mean.excalidraw ├── geometric-mean.png ├── impermanent-loss.excalidraw ├── impermanent-loss.png ├── options-payoff.excalidraw ├── options-payoff.png ├── rai-1-intro.excalidraw ├── rai-1-intro.png ├── rai-2-borrow-repay.excalidraw ├── rai-2-borrow-repay.png ├── rai-3-price.excalidraw ├── rai-3-price.png ├── read-only-reentrancy.excalidraw ├── read-only-reentrancy.png ├── staking-rewards.excalidraw ├── staking-rewards.png ├── tornado-hack.excalidraw ├── tornado-hack.png ├── uni-v2-liquidity-delta.excalidraw ├── uni-v2-liquidity-delta.png ├── uni-v3 │ ├── clamm │ │ ├── clamm-0-price-tick.excalidraw │ │ ├── clamm-0-price-tick.png │ │ ├── clamm-1-sqrt-price-x-96.excalidraw │ │ ├── clamm-1-sqrt-price-x-96.png │ │ ├── clamm-2-sqrt-price-to-tick.excalidraw │ │ ├── clamm-2-sqrt-price-to-tick.png │ │ ├── clamm-3-liquidity-price-reserves.excalidraw │ │ ├── clamm-3-liquidity-price-reserves.png │ │ ├── clamm-4-liquidity-net.excalidraw │ │ └── clamm-4-liquidity-net.png │ ├── uni-v3-liquidity-delta.excalidraw │ ├── uni-v3-liquidity-delta.png │ ├── uni-v3-liquidity-example.excalidraw │ ├── uni-v3-liquidity-example.png │ ├── uni-v3-real-reserves-curve.excalidraw │ ├── uni-v3-real-reserves-curve.png │ ├── uni-v3-single-pos-liq.excalidraw │ ├── uni-v3-single-pos-liq.png │ ├── uni-v3-twap-geometric-mean.excalidraw │ ├── uni-v3-twap-geometric-mean.png │ ├── uniswap-v3-capital-efficiency.excalidraw │ ├── uniswap-v3-capital-efficiency.png │ ├── uniswap-v3-fee-1-calc-fee.excalidraw │ ├── uniswap-v3-fee-1-calc-fee.png │ ├── uniswap-v3-fee-2-fee-growth.excalidraw │ ├── uniswap-v3-fee-2-fee-growth.png │ ├── uniswap-v3-fee-3-fee-growth-inside.excalidraw │ ├── uniswap-v3-fee-3-fee-growth-inside.png │ ├── uniswap-v3-fee-4-fee-growth-below-1.excalidraw │ ├── uniswap-v3-fee-4-fee-growth-below-1.png │ ├── uniswap-v3-fee-5-fee-growth-below-2.excalidraw │ ├── uniswap-v3-fee-5-fee-growth-below-2.png │ ├── uniswap-v3-fee-6-fee-growth-above.excalidraw │ ├── uniswap-v3-fee-6-fee-growth-above.png │ ├── uniswap-v3-fee-7-initialize.excalidraw │ ├── uniswap-v3-jit.excalidraw │ ├── uniswap-v3-jit.png │ ├── uniswap-v3-liquidity-price-example.excalidraw │ ├── uniswap-v3-liquidity-price-example.png │ ├── uniswap-v3-liquidity-price.excalidraw │ ├── uniswap-v3-liquidity-price.png │ ├── uniswap-v3-sqrt-price.excalidraw │ ├── uniswap-v3-sqrt-price.png │ ├── uniswap-v3-swap-price-delta.excalidraw │ ├── uniswap-v3-swap-price-delta.png │ ├── uniswap-v3-tick-and-sqrt-price-x-96.excalidraw │ ├── uniswap-v3-tick-and-sqrt-price-x-96.png │ ├── uniswap-v3-twap-inverse-price.excalidraw │ ├── uniswap-v3-twap-inverse-price.png │ ├── uniswap-v3-twap.excalidraw │ └── uniswap-v3-twap.png ├── uniswap-v2-twap.jpeg ├── vault.excalidraw └── vault.png ├── node └── prefix-tree.js ├── notebook ├── ema.ipynb ├── fft.ipynb ├── log2.py.ipynb ├── quadratic_funding.ipynb ├── rpow.ipynb └── uniswap-v3 │ ├── sqrt_price.ipynb │ ├── sqrt_price_to_tick.ipynb │ ├── tick-and-sqrt-price-x-96.ipynb │ └── tick.ipynb └── zk └── zkp.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints 2 | tmp -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # notes 2 | -------------------------------------------------------------------------------- /excalidraw/algo/bin-exp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/algo/bin-exp.png -------------------------------------------------------------------------------- /excalidraw/algo/binary-log-algo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/algo/binary-log-algo.png -------------------------------------------------------------------------------- /excalidraw/algo/dec-to-bin-algo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/algo/dec-to-bin-algo.png -------------------------------------------------------------------------------- /excalidraw/algo/fft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/algo/fft.png -------------------------------------------------------------------------------- /excalidraw/algo/most-significant-bit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/algo/most-significant-bit.png -------------------------------------------------------------------------------- /excalidraw/algo/twos-complement.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/algo/twos-complement.png -------------------------------------------------------------------------------- /excalidraw/cpamm-arbitrage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/cpamm-arbitrage.png -------------------------------------------------------------------------------- /excalidraw/cpamm-spot-price-examples.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/cpamm-spot-price-examples.png -------------------------------------------------------------------------------- /excalidraw/cpamm-spot-price.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/cpamm-spot-price.png -------------------------------------------------------------------------------- /excalidraw/cpamm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/cpamm.png -------------------------------------------------------------------------------- /excalidraw/csamm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/csamm.png -------------------------------------------------------------------------------- /excalidraw/dai-stability-fee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/dai-stability-fee.png -------------------------------------------------------------------------------- /excalidraw/discrete-staking-rewards.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/discrete-staking-rewards.png -------------------------------------------------------------------------------- /excalidraw/ema-irregular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/ema-irregular.png -------------------------------------------------------------------------------- /excalidraw/ema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/ema.png -------------------------------------------------------------------------------- /excalidraw/erc1155.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/erc1155.png -------------------------------------------------------------------------------- /excalidraw/gas-less-token-transfer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/gas-less-token-transfer.png -------------------------------------------------------------------------------- /excalidraw/geometric-mean.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/geometric-mean.png -------------------------------------------------------------------------------- /excalidraw/impermanent-loss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/impermanent-loss.png -------------------------------------------------------------------------------- /excalidraw/options-payoff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/options-payoff.png -------------------------------------------------------------------------------- /excalidraw/rai-1-intro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/rai-1-intro.png -------------------------------------------------------------------------------- /excalidraw/rai-2-borrow-repay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/rai-2-borrow-repay.png -------------------------------------------------------------------------------- /excalidraw/rai-3-price.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/rai-3-price.png -------------------------------------------------------------------------------- /excalidraw/read-only-reentrancy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/read-only-reentrancy.png -------------------------------------------------------------------------------- /excalidraw/staking-rewards.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/staking-rewards.png -------------------------------------------------------------------------------- /excalidraw/tornado-hack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/tornado-hack.png -------------------------------------------------------------------------------- /excalidraw/uni-v2-liquidity-delta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v2-liquidity-delta.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/clamm/clamm-0-price-tick.excalidraw: -------------------------------------------------------------------------------- 1 | { 2 | "type": "excalidraw", 3 | "version": 2, 4 | "source": "https://excalidraw.com", 5 | "elements": [ 6 | { 7 | "type": "text", 8 | "version": 667, 9 | "versionNonce": 2022440465, 10 | "isDeleted": false, 11 | "id": "0ROfIW68A7sIEy3WA4Bfo", 12 | "fillStyle": "hachure", 13 | "strokeWidth": 1, 14 | "strokeStyle": "solid", 15 | "roughness": 0, 16 | "opacity": 100, 17 | "angle": 0, 18 | "x": 1387.1380612143935, 19 | "y": 9959.246523208998, 20 | "strokeColor": "#000000", 21 | "backgroundColor": "#c92a2a", 22 | "width": 452.7721252441406, 23 | "height": 45, 24 | "seed": 1259805291, 25 | "groupIds": [], 26 | "frameId": null, 27 | "roundness": null, 28 | "boundElements": [], 29 | "updated": 1689512215642, 30 | "link": null, 31 | "locked": false, 32 | "fontSize": 36, 33 | "fontFamily": 1, 34 | "text": "Uniswap V3 price and tick", 35 | "textAlign": "left", 36 | "verticalAlign": "top", 37 | "containerId": null, 38 | "originalText": "Uniswap V3 price and tick", 39 | "lineHeight": 1.25, 40 | "baseline": 32 41 | }, 42 | { 43 | "type": "line", 44 | "version": 826, 45 | "versionNonce": 617047935, 46 | "isDeleted": false, 47 | "id": "E3zcwnEdB001SvhWOF03M", 48 | "fillStyle": "hachure", 49 | "strokeWidth": 2, 50 | "strokeStyle": "solid", 51 | "roughness": 0, 52 | "opacity": 100, 53 | "angle": 0, 54 | "x": 1386.471394547727, 55 | "y": 10000.413189875664, 56 | "strokeColor": "#000000", 57 | "backgroundColor": "transparent", 58 | "width": 450.848484848485, 59 | "height": 0.24242424242402194, 60 | "seed": 1686260619, 61 | "groupIds": [], 62 | "frameId": null, 63 | "roundness": null, 64 | "boundElements": [], 65 | "updated": 1689512215642, 66 | "link": null, 67 | "locked": false, 68 | "startBinding": null, 69 | "endBinding": null, 70 | "lastCommittedPoint": null, 71 | "startArrowhead": null, 72 | "endArrowhead": null, 73 | "points": [ 74 | [ 75 | 0, 76 | 0 77 | ], 78 | [ 79 | 450.848484848485, 80 | -0.24242424242402194 81 | ] 82 | ] 83 | }, 84 | { 85 | "type": "text", 86 | "version": 96, 87 | "versionNonce": 714932531, 88 | "isDeleted": false, 89 | "id": "fGiBaBpdeeB057ixXF56z", 90 | "fillStyle": "solid", 91 | "strokeWidth": 4, 92 | "strokeStyle": "solid", 93 | "roughness": 0, 94 | "opacity": 100, 95 | "angle": 0, 96 | "x": 1424.4000887453537, 97 | "y": 10046.58537101957, 98 | "strokeColor": "#e03131", 99 | "backgroundColor": "transparent", 100 | "width": 16.744064331054688, 101 | "height": 35, 102 | "seed": 359632819, 103 | "groupIds": [], 104 | "frameId": null, 105 | "roundness": null, 106 | "boundElements": [], 107 | "updated": 1689166350654, 108 | "link": null, 109 | "locked": false, 110 | "fontSize": 28, 111 | "fontFamily": 1, 112 | "text": "X", 113 | "textAlign": "left", 114 | "verticalAlign": "top", 115 | "containerId": null, 116 | "originalText": "X", 117 | "lineHeight": 1.25, 118 | "baseline": 25 119 | }, 120 | { 121 | "type": "text", 122 | "version": 143, 123 | "versionNonce": 445980541, 124 | "isDeleted": false, 125 | "id": "PQERxlobVb-tapXKRezEA", 126 | "fillStyle": "solid", 127 | "strokeWidth": 4, 128 | "strokeStyle": "solid", 129 | "roughness": 0, 130 | "opacity": 100, 131 | "angle": 0, 132 | "x": 1425.3091796544447, 133 | "y": 10096.58537101957, 134 | "strokeColor": "#1971c2", 135 | "backgroundColor": "transparent", 136 | "width": 14.44805908203125, 137 | "height": 35, 138 | "seed": 2102173235, 139 | "groupIds": [], 140 | "frameId": null, 141 | "roundness": null, 142 | "boundElements": [], 143 | "updated": 1689166350654, 144 | "link": null, 145 | "locked": false, 146 | "fontSize": 28, 147 | "fontFamily": 1, 148 | "text": "Y", 149 | "textAlign": "left", 150 | "verticalAlign": "top", 151 | "containerId": null, 152 | "originalText": "Y", 153 | "lineHeight": 1.25, 154 | "baseline": 25 155 | }, 156 | { 157 | "type": "text", 158 | "version": 125, 159 | "versionNonce": 1550607059, 160 | "isDeleted": false, 161 | "id": "TUq2sG0dFYdTW0Ycgg05Z", 162 | "fillStyle": "solid", 163 | "strokeWidth": 4, 164 | "strokeStyle": "solid", 165 | "roughness": 0, 166 | "opacity": 100, 167 | "angle": 0, 168 | "x": 1456.2182705635353, 169 | "y": 10047.494461928662, 170 | "strokeColor": "#1e1e1e", 171 | "backgroundColor": "transparent", 172 | "width": 17.276077270507812, 173 | "height": 35, 174 | "seed": 148702131, 175 | "groupIds": [], 176 | "frameId": null, 177 | "roundness": null, 178 | "boundElements": [], 179 | "updated": 1689166350654, 180 | "link": null, 181 | "locked": false, 182 | "fontSize": 28, 183 | "fontFamily": 1, 184 | "text": "=", 185 | "textAlign": "left", 186 | "verticalAlign": "top", 187 | "containerId": null, 188 | "originalText": "=", 189 | "lineHeight": 1.25, 190 | "baseline": 25 191 | }, 192 | { 193 | "type": "text", 194 | "version": 120, 195 | "versionNonce": 958277597, 196 | "isDeleted": false, 197 | "id": "iAmnYgDdky8EVbiOx4yag", 198 | "fillStyle": "solid", 199 | "strokeWidth": 4, 200 | "strokeStyle": "solid", 201 | "roughness": 0, 202 | "opacity": 100, 203 | "angle": 0, 204 | "x": 1492.581906927172, 205 | "y": 10045.676280110478, 206 | "strokeColor": "#1e1e1e", 207 | "backgroundColor": "transparent", 208 | "width": 106.62446594238281, 209 | "height": 35, 210 | "seed": 1613438099, 211 | "groupIds": [], 212 | "frameId": null, 213 | "roundness": null, 214 | "boundElements": [], 215 | "updated": 1689166350654, 216 | "link": null, 217 | "locked": false, 218 | "fontSize": 28, 219 | "fontFamily": 1, 220 | "text": "token 0", 221 | "textAlign": "left", 222 | "verticalAlign": "top", 223 | "containerId": null, 224 | "originalText": "token 0", 225 | "lineHeight": 1.25, 226 | "baseline": 25 227 | }, 228 | { 229 | "type": "text", 230 | "version": 180, 231 | "versionNonce": 220106867, 232 | "isDeleted": false, 233 | "id": "T2_ql59b0ld9Ed-Qs26pD", 234 | "fillStyle": "solid", 235 | "strokeWidth": 4, 236 | "strokeStyle": "solid", 237 | "roughness": 0, 238 | "opacity": 100, 239 | "angle": 0, 240 | "x": 1458.0364523817173, 241 | "y": 10096.58537101957, 242 | "strokeColor": "#1e1e1e", 243 | "backgroundColor": "transparent", 244 | "width": 17.276077270507812, 245 | "height": 35, 246 | "seed": 244813811, 247 | "groupIds": [], 248 | "frameId": null, 249 | "roundness": null, 250 | "boundElements": [], 251 | "updated": 1689166350654, 252 | "link": null, 253 | "locked": false, 254 | "fontSize": 28, 255 | "fontFamily": 1, 256 | "text": "=", 257 | "textAlign": "left", 258 | "verticalAlign": "top", 259 | "containerId": null, 260 | "originalText": "=", 261 | "lineHeight": 1.25, 262 | "baseline": 25 263 | }, 264 | { 265 | "type": "text", 266 | "version": 145, 267 | "versionNonce": 1176970301, 268 | "isDeleted": false, 269 | "id": "vop-aj8i21TgWFztSV3pI", 270 | "fillStyle": "solid", 271 | "strokeWidth": 4, 272 | "strokeStyle": "solid", 273 | "roughness": 0, 274 | "opacity": 100, 275 | "angle": 0, 276 | "x": 1495.309179654445, 277 | "y": 10094.767189201388, 278 | "strokeColor": "#1e1e1e", 279 | "backgroundColor": "transparent", 280 | "width": 94.94841003417969, 281 | "height": 35, 282 | "seed": 894725939, 283 | "groupIds": [], 284 | "frameId": null, 285 | "roundness": null, 286 | "boundElements": [], 287 | "updated": 1689166350654, 288 | "link": null, 289 | "locked": false, 290 | "fontSize": 28, 291 | "fontFamily": 1, 292 | "text": "token 1", 293 | "textAlign": "left", 294 | "verticalAlign": "top", 295 | "containerId": null, 296 | "originalText": "token 1", 297 | "lineHeight": 1.25, 298 | "baseline": 25 299 | }, 300 | { 301 | "type": "text", 302 | "version": 629, 303 | "versionNonce": 1853491731, 304 | "isDeleted": false, 305 | "id": "LgicpG8zaRoB_0dFVltzu", 306 | "fillStyle": "hachure", 307 | "strokeWidth": 2, 308 | "strokeStyle": "solid", 309 | "roughness": 0, 310 | "opacity": 100, 311 | "angle": 0, 312 | "x": 1426.539992189586, 313 | "y": 10158.176280110476, 314 | "strokeColor": "#6741d9", 315 | "backgroundColor": "transparent", 316 | "width": 18.508071899414062, 317 | "height": 35, 318 | "seed": 1751831763, 319 | "groupIds": [], 320 | "frameId": null, 321 | "roundness": null, 322 | "boundElements": [], 323 | "updated": 1689166350654, 324 | "link": null, 325 | "locked": false, 326 | "fontSize": 28, 327 | "fontFamily": 1, 328 | "text": "P", 329 | "textAlign": "left", 330 | "verticalAlign": "top", 331 | "containerId": null, 332 | "originalText": "P", 333 | "lineHeight": 1.25, 334 | "baseline": 25 335 | }, 336 | { 337 | "type": "text", 338 | "version": 234, 339 | "versionNonce": 1435604125, 340 | "isDeleted": false, 341 | "id": "jOr2N61EQ3t3q3Kh9G_9p", 342 | "fillStyle": "solid", 343 | "strokeWidth": 4, 344 | "strokeStyle": "solid", 345 | "roughness": 0, 346 | "opacity": 100, 347 | "angle": 0, 348 | "x": 1458.9741713222213, 349 | "y": 10156.358098292294, 350 | "strokeColor": "#1e1e1e", 351 | "backgroundColor": "transparent", 352 | "width": 17.276077270507812, 353 | "height": 35, 354 | "seed": 1650985651, 355 | "groupIds": [], 356 | "frameId": null, 357 | "roundness": null, 358 | "boundElements": [], 359 | "updated": 1689166350654, 360 | "link": null, 361 | "locked": false, 362 | "fontSize": 28, 363 | "fontFamily": 1, 364 | "text": "=", 365 | "textAlign": "left", 366 | "verticalAlign": "top", 367 | "containerId": null, 368 | "originalText": "=", 369 | "lineHeight": 1.25, 370 | "baseline": 25 371 | }, 372 | { 373 | "type": "text", 374 | "version": 859, 375 | "versionNonce": 896880563, 376 | "isDeleted": false, 377 | "id": "c9mM-bjCRTIpO0qDKWkK5", 378 | "fillStyle": "hachure", 379 | "strokeWidth": 2, 380 | "strokeStyle": "solid", 381 | "roughness": 0, 382 | "opacity": 100, 383 | "angle": 0, 384 | "x": 1503.183194768969, 385 | "y": 10155.873249807446, 386 | "strokeColor": "#000000", 387 | "backgroundColor": "transparent", 388 | "width": 334.79742431640625, 389 | "height": 35, 390 | "seed": 1763886259, 391 | "groupIds": [], 392 | "frameId": null, 393 | "roundness": null, 394 | "boundElements": [], 395 | "updated": 1689166350654, 396 | "link": null, 397 | "locked": false, 398 | "fontSize": 28, 399 | "fontFamily": 1, 400 | "text": "Price of X in terms of Y", 401 | "textAlign": "left", 402 | "verticalAlign": "top", 403 | "containerId": null, 404 | "originalText": "Price of X in terms of Y", 405 | "lineHeight": 1.25, 406 | "baseline": 25 407 | }, 408 | { 409 | "type": "text", 410 | "version": 182, 411 | "versionNonce": 51312893, 412 | "isDeleted": false, 413 | "id": "x_Ioux1Ag7QKWV8bd8UBU", 414 | "fillStyle": "solid", 415 | "strokeWidth": 4, 416 | "strokeStyle": "solid", 417 | "roughness": 0, 418 | "opacity": 100, 419 | "angle": 0, 420 | "x": 1626.7553293070994, 421 | "y": 10155.87324980745, 422 | "strokeColor": "#e03131", 423 | "backgroundColor": "transparent", 424 | "width": 16.744064331054688, 425 | "height": 35, 426 | "seed": 874539571, 427 | "groupIds": [], 428 | "frameId": null, 429 | "roundness": null, 430 | "boundElements": [], 431 | "updated": 1689166350654, 432 | "link": null, 433 | "locked": false, 434 | "fontSize": 28, 435 | "fontFamily": 1, 436 | "text": "X", 437 | "textAlign": "left", 438 | "verticalAlign": "top", 439 | "containerId": null, 440 | "originalText": "X", 441 | "lineHeight": 1.25, 442 | "baseline": 25 443 | }, 444 | { 445 | "type": "text", 446 | "version": 232, 447 | "versionNonce": 876011859, 448 | "isDeleted": false, 449 | "id": "BZxeh0znb0SlzD6ckX0xm", 450 | "fillStyle": "solid", 451 | "strokeWidth": 4, 452 | "strokeStyle": "solid", 453 | "roughness": 0, 454 | "opacity": 100, 455 | "angle": 0, 456 | "x": 1823.933634961914, 457 | "y": 10155.87324980745, 458 | "strokeColor": "#1971c2", 459 | "backgroundColor": "transparent", 460 | "width": 14.44805908203125, 461 | "height": 35, 462 | "seed": 341338259, 463 | "groupIds": [], 464 | "frameId": null, 465 | "roundness": null, 466 | "boundElements": [], 467 | "updated": 1689166350654, 468 | "link": null, 469 | "locked": false, 470 | "fontSize": 28, 471 | "fontFamily": 1, 472 | "text": "Y", 473 | "textAlign": "left", 474 | "verticalAlign": "top", 475 | "containerId": null, 476 | "originalText": "Y", 477 | "lineHeight": 1.25, 478 | "baseline": 25 479 | }, 480 | { 481 | "type": "text", 482 | "version": 598, 483 | "versionNonce": 2015416669, 484 | "isDeleted": false, 485 | "id": "7pQs416nsBf9_VUrpO9Vp", 486 | "fillStyle": "hachure", 487 | "strokeWidth": 2, 488 | "strokeStyle": "solid", 489 | "roughness": 0, 490 | "opacity": 100, 491 | "angle": 0, 492 | "x": 1864.7317470797964, 493 | "y": 10156.055067989268, 494 | "strokeColor": "#000000", 495 | "backgroundColor": "transparent", 496 | "width": 17.276077270507812, 497 | "height": 35, 498 | "seed": 1558009811, 499 | "groupIds": [], 500 | "frameId": null, 501 | "roundness": null, 502 | "boundElements": [], 503 | "updated": 1689166350654, 504 | "link": null, 505 | "locked": false, 506 | "fontSize": 28, 507 | "fontFamily": 1, 508 | "text": "=", 509 | "textAlign": "left", 510 | "verticalAlign": "top", 511 | "containerId": null, 512 | "originalText": "=", 513 | "lineHeight": 1.25, 514 | "baseline": 25 515 | }, 516 | { 517 | "type": "text", 518 | "version": 469, 519 | "versionNonce": 873807603, 520 | "isDeleted": false, 521 | "id": "7FgqxsMFasNkjMiDDDi7N", 522 | "fillStyle": "hachure", 523 | "strokeWidth": 2, 524 | "strokeStyle": "solid", 525 | "roughness": 0, 526 | "opacity": 100, 527 | "angle": 0, 528 | "x": 1921.7031190483842, 529 | "y": 10138.721734655934, 530 | "strokeColor": "#1971c2", 531 | "backgroundColor": "transparent", 532 | "width": 14.44805908203125, 533 | "height": 35, 534 | "seed": 1216819219, 535 | "groupIds": [], 536 | "frameId": null, 537 | "roundness": null, 538 | "boundElements": [], 539 | "updated": 1689166350654, 540 | "link": null, 541 | "locked": false, 542 | "fontSize": 28, 543 | "fontFamily": 1, 544 | "text": "Y", 545 | "textAlign": "left", 546 | "verticalAlign": "top", 547 | "containerId": null, 548 | "originalText": "Y", 549 | "lineHeight": 1.25, 550 | "baseline": 25 551 | }, 552 | { 553 | "type": "line", 554 | "version": 505, 555 | "versionNonce": 840474045, 556 | "isDeleted": false, 557 | "id": "mfrxWeqvciV6E1P0_4DXl", 558 | "fillStyle": "hachure", 559 | "strokeWidth": 2, 560 | "strokeStyle": "solid", 561 | "roughness": 0, 562 | "opacity": 100, 563 | "angle": 0, 564 | "x": 1904.3697857150503, 565 | "y": 10172.55506798927, 566 | "strokeColor": "#000000", 567 | "backgroundColor": "transparent", 568 | "width": 47.33333333333326, 569 | "height": 0, 570 | "seed": 1592636851, 571 | "groupIds": [], 572 | "frameId": null, 573 | "roundness": null, 574 | "boundElements": [], 575 | "updated": 1689166350654, 576 | "link": null, 577 | "locked": false, 578 | "startBinding": null, 579 | "endBinding": null, 580 | "lastCommittedPoint": null, 581 | "startArrowhead": null, 582 | "endArrowhead": null, 583 | "points": [ 584 | [ 585 | 0, 586 | 0 587 | ], 588 | [ 589 | 47.33333333333326, 590 | 0 591 | ] 592 | ] 593 | }, 594 | { 595 | "type": "text", 596 | "version": 472, 597 | "versionNonce": 261548179, 598 | "isDeleted": false, 599 | "id": "oD8LudIjcCkm_Fp8jGHm2", 600 | "fillStyle": "hachure", 601 | "strokeWidth": 2, 602 | "strokeStyle": "solid", 603 | "roughness": 0, 604 | "opacity": 100, 605 | "angle": 0, 606 | "x": 1918.3697857150503, 607 | "y": 10174.721734655934, 608 | "strokeColor": "#e03131", 609 | "backgroundColor": "transparent", 610 | "width": 16.744064331054688, 611 | "height": 35, 612 | "seed": 498239315, 613 | "groupIds": [], 614 | "frameId": null, 615 | "roundness": null, 616 | "boundElements": [], 617 | "updated": 1689166350654, 618 | "link": null, 619 | "locked": false, 620 | "fontSize": 28, 621 | "fontFamily": 1, 622 | "text": "X", 623 | "textAlign": "left", 624 | "verticalAlign": "top", 625 | "containerId": null, 626 | "originalText": "X", 627 | "lineHeight": 1.25, 628 | "baseline": 25 629 | }, 630 | { 631 | "type": "text", 632 | "version": 675, 633 | "versionNonce": 1374163, 634 | "isDeleted": false, 635 | "id": "HHhJVy9GXk3Vre-hZ7Ld0", 636 | "fillStyle": "hachure", 637 | "strokeWidth": 2, 638 | "strokeStyle": "solid", 639 | "roughness": 0, 640 | "opacity": 100, 641 | "angle": 0, 642 | "x": 1425.2293117929576, 643 | "y": 10235.430324614357, 644 | "strokeColor": "#6741d9", 645 | "backgroundColor": "transparent", 646 | "width": 18.508071899414062, 647 | "height": 35, 648 | "seed": 38219379, 649 | "groupIds": [], 650 | "frameId": null, 651 | "roundness": null, 652 | "boundElements": [], 653 | "updated": 1689238862053, 654 | "link": null, 655 | "locked": false, 656 | "fontSize": 28, 657 | "fontFamily": 1, 658 | "text": "P", 659 | "textAlign": "left", 660 | "verticalAlign": "top", 661 | "containerId": null, 662 | "originalText": "P", 663 | "lineHeight": 1.25, 664 | "baseline": 25 665 | }, 666 | { 667 | "type": "text", 668 | "version": 284, 669 | "versionNonce": 1815516499, 670 | "isDeleted": false, 671 | "id": "CjqCoXVMHc5TgvaMtF9f9", 672 | "fillStyle": "solid", 673 | "strokeWidth": 4, 674 | "strokeStyle": "solid", 675 | "roughness": 0, 676 | "opacity": 100, 677 | "angle": 0, 678 | "x": 1459.1786424407442, 679 | "y": 10232.763657947691, 680 | "strokeColor": "#1e1e1e", 681 | "backgroundColor": "transparent", 682 | "width": 17.276077270507812, 683 | "height": 35, 684 | "seed": 665032765, 685 | "groupIds": [], 686 | "frameId": null, 687 | "roundness": null, 688 | "boundElements": [], 689 | "updated": 1689238879859, 690 | "link": null, 691 | "locked": false, 692 | "fontSize": 28, 693 | "fontFamily": 1, 694 | "text": "=", 695 | "textAlign": "left", 696 | "verticalAlign": "top", 697 | "containerId": null, 698 | "originalText": "=", 699 | "lineHeight": 1.25, 700 | "baseline": 25 701 | }, 702 | { 703 | "type": "text", 704 | "version": 81, 705 | "versionNonce": 1748698419, 706 | "isDeleted": false, 707 | "id": "qHUSx0Exp0Nlu-ygH2bsT", 708 | "fillStyle": "solid", 709 | "strokeWidth": 2, 710 | "strokeStyle": "solid", 711 | "roughness": 0, 712 | "opacity": 100, 713 | "angle": 0, 714 | "x": 1489.4833477426644, 715 | "y": 10233.596991281023, 716 | "strokeColor": "#1e1e1e", 717 | "backgroundColor": "transparent", 718 | "width": 80.64033508300781, 719 | "height": 35, 720 | "seed": 2036222451, 721 | "groupIds": [], 722 | "frameId": null, 723 | "roundness": null, 724 | "boundElements": [], 725 | "updated": 1689239219993, 726 | "link": null, 727 | "locked": false, 728 | "fontSize": 28, 729 | "fontFamily": 1, 730 | "text": "1.0001", 731 | "textAlign": "left", 732 | "verticalAlign": "top", 733 | "containerId": null, 734 | "originalText": "1.0001", 735 | "lineHeight": 1.25, 736 | "baseline": 25 737 | }, 738 | { 739 | "type": "text", 740 | "version": 187, 741 | "versionNonce": 604200509, 742 | "isDeleted": false, 743 | "id": "e_k-H0EbgP76C1YzePik3", 744 | "fillStyle": "solid", 745 | "strokeWidth": 2, 746 | "strokeStyle": "solid", 747 | "roughness": 0, 748 | "opacity": 100, 749 | "angle": 0, 750 | "x": 1572.4833477426641, 751 | "y": 10213.596991281025, 752 | "strokeColor": "#2f9e44", 753 | "backgroundColor": "transparent", 754 | "width": 49.64421081542969, 755 | "height": 35, 756 | "seed": 1883832861, 757 | "groupIds": [], 758 | "frameId": null, 759 | "roundness": null, 760 | "boundElements": [], 761 | "updated": 1689239236230, 762 | "link": null, 763 | "locked": false, 764 | "fontSize": 28, 765 | "fontFamily": 1, 766 | "text": "tick", 767 | "textAlign": "left", 768 | "verticalAlign": "top", 769 | "containerId": null, 770 | "originalText": "tick", 771 | "lineHeight": 1.25, 772 | "baseline": 25 773 | }, 774 | { 775 | "id": "lXJ4QxblU1WBKQZgNG2YK", 776 | "type": "text", 777 | "x": 1425.7088641016753, 778 | "y": 10314.59555167352, 779 | "width": 165.31268310546875, 780 | "height": 35, 781 | "angle": 0, 782 | "strokeColor": "#2f9e44", 783 | "backgroundColor": "transparent", 784 | "fillStyle": "solid", 785 | "strokeWidth": 2, 786 | "strokeStyle": "solid", 787 | "roughness": 0, 788 | "opacity": 100, 789 | "groupIds": [], 790 | "frameId": null, 791 | "roundness": null, 792 | "seed": 1448914015, 793 | "version": 70, 794 | "versionNonce": 672830001, 795 | "isDeleted": false, 796 | "boundElements": null, 797 | "updated": 1689512709049, 798 | "link": null, 799 | "locked": false, 800 | "text": "Tick spacing", 801 | "fontSize": 28, 802 | "fontFamily": 1, 803 | "textAlign": "left", 804 | "verticalAlign": "top", 805 | "baseline": 25, 806 | "containerId": null, 807 | "originalText": "Tick spacing", 808 | "lineHeight": 1.25, 809 | "isFrameName": false 810 | }, 811 | { 812 | "id": "dSgXXakUHshZV-DtTSX-2", 813 | "type": "line", 814 | "x": 1654.3755307683423, 815 | "y": 10514.595551673521, 816 | "width": 369.9999999999998, 817 | "height": 0, 818 | "angle": 0, 819 | "strokeColor": "#1e1e1e", 820 | "backgroundColor": "transparent", 821 | "fillStyle": "solid", 822 | "strokeWidth": 2, 823 | "strokeStyle": "solid", 824 | "roughness": 0, 825 | "opacity": 100, 826 | "groupIds": [], 827 | "frameId": null, 828 | "roundness": null, 829 | "seed": 1136859985, 830 | "version": 366, 831 | "versionNonce": 1017938911, 832 | "isDeleted": false, 833 | "boundElements": null, 834 | "updated": 1689512864508, 835 | "link": null, 836 | "locked": false, 837 | "points": [ 838 | [ 839 | 0, 840 | 0 841 | ], 842 | [ 843 | 369.9999999999998, 844 | 0 845 | ] 846 | ], 847 | "lastCommittedPoint": null, 848 | "startBinding": null, 849 | "endBinding": null, 850 | "startArrowhead": null, 851 | "endArrowhead": null 852 | }, 853 | { 854 | "id": "F6vMuok1HTOHtHRlM62Wp", 855 | "type": "line", 856 | "x": 1671.0421974350093, 857 | "y": 10505.262218340185, 858 | "width": 0, 859 | "height": 18, 860 | "angle": 0, 861 | "strokeColor": "#1e1e1e", 862 | "backgroundColor": "transparent", 863 | "fillStyle": "solid", 864 | "strokeWidth": 2, 865 | "strokeStyle": "solid", 866 | "roughness": 0, 867 | "opacity": 100, 868 | "groupIds": [], 869 | "frameId": null, 870 | "roundness": null, 871 | "seed": 1665655327, 872 | "version": 430, 873 | "versionNonce": 355822993, 874 | "isDeleted": false, 875 | "boundElements": null, 876 | "updated": 1689512864508, 877 | "link": null, 878 | "locked": false, 879 | "points": [ 880 | [ 881 | 0, 882 | 0 883 | ], 884 | [ 885 | 0, 886 | 18 887 | ] 888 | ], 889 | "lastCommittedPoint": null, 890 | "startBinding": null, 891 | "endBinding": null, 892 | "startArrowhead": null, 893 | "endArrowhead": null 894 | }, 895 | { 896 | "type": "line", 897 | "version": 485, 898 | "versionNonce": 357478399, 899 | "isDeleted": false, 900 | "id": "MN7S73kcVwVVTCZaBvB-i", 901 | "fillStyle": "solid", 902 | "strokeWidth": 2, 903 | "strokeStyle": "solid", 904 | "roughness": 0, 905 | "opacity": 100, 906 | "angle": 0, 907 | "x": 1709.7088641016758, 908 | "y": 10504.595551673521, 909 | "strokeColor": "#1e1e1e", 910 | "backgroundColor": "transparent", 911 | "width": 0, 912 | "height": 18, 913 | "seed": 276614719, 914 | "groupIds": [], 915 | "frameId": null, 916 | "roundness": null, 917 | "boundElements": [], 918 | "updated": 1689512864508, 919 | "link": null, 920 | "locked": false, 921 | "startBinding": null, 922 | "endBinding": null, 923 | "lastCommittedPoint": null, 924 | "startArrowhead": null, 925 | "endArrowhead": null, 926 | "points": [ 927 | [ 928 | 0, 929 | 0 930 | ], 931 | [ 932 | 0, 933 | 18 934 | ] 935 | ] 936 | }, 937 | { 938 | "type": "line", 939 | "version": 530, 940 | "versionNonce": 808686449, 941 | "isDeleted": false, 942 | "id": "R-IXI7pMIbN4cNErlqTlh", 943 | "fillStyle": "solid", 944 | "strokeWidth": 2, 945 | "strokeStyle": "solid", 946 | "roughness": 0, 947 | "opacity": 100, 948 | "angle": 0, 949 | "x": 1749.7088641016753, 950 | "y": 10504.928885006853, 951 | "strokeColor": "#1e1e1e", 952 | "backgroundColor": "transparent", 953 | "width": 0, 954 | "height": 18, 955 | "seed": 1593611505, 956 | "groupIds": [], 957 | "frameId": null, 958 | "roundness": null, 959 | "boundElements": [], 960 | "updated": 1689512864508, 961 | "link": null, 962 | "locked": false, 963 | "startBinding": null, 964 | "endBinding": null, 965 | "lastCommittedPoint": null, 966 | "startArrowhead": null, 967 | "endArrowhead": null, 968 | "points": [ 969 | [ 970 | 0, 971 | 0 972 | ], 973 | [ 974 | 0, 975 | 18 976 | ] 977 | ] 978 | }, 979 | { 980 | "type": "line", 981 | "version": 581, 982 | "versionNonce": 1293309983, 983 | "isDeleted": false, 984 | "id": "RZScE738W5zBJzFItsldz", 985 | "fillStyle": "solid", 986 | "strokeWidth": 2, 987 | "strokeStyle": "solid", 988 | "roughness": 0, 989 | "opacity": 100, 990 | "angle": 0, 991 | "x": 1789.7088641016749, 992 | "y": 10505.59555167352, 993 | "strokeColor": "#1e1e1e", 994 | "backgroundColor": "transparent", 995 | "width": 0, 996 | "height": 18, 997 | "seed": 948375281, 998 | "groupIds": [], 999 | "frameId": null, 1000 | "roundness": null, 1001 | "boundElements": [], 1002 | "updated": 1689512864508, 1003 | "link": null, 1004 | "locked": false, 1005 | "startBinding": null, 1006 | "endBinding": null, 1007 | "lastCommittedPoint": null, 1008 | "startArrowhead": null, 1009 | "endArrowhead": null, 1010 | "points": [ 1011 | [ 1012 | 0, 1013 | 0 1014 | ], 1015 | [ 1016 | 0, 1017 | 18 1018 | ] 1019 | ] 1020 | }, 1021 | { 1022 | "type": "line", 1023 | "version": 627, 1024 | "versionNonce": 2016542033, 1025 | "isDeleted": false, 1026 | "id": "Ll8bUihePgzXy2AVpVgWK", 1027 | "fillStyle": "solid", 1028 | "strokeWidth": 2, 1029 | "strokeStyle": "solid", 1030 | "roughness": 0, 1031 | "opacity": 100, 1032 | "angle": 0, 1033 | "x": 1831.0421974350088, 1034 | "y": 10505.595551673521, 1035 | "strokeColor": "#1e1e1e", 1036 | "backgroundColor": "transparent", 1037 | "width": 0, 1038 | "height": 18, 1039 | "seed": 57218335, 1040 | "groupIds": [], 1041 | "frameId": null, 1042 | "roundness": null, 1043 | "boundElements": [], 1044 | "updated": 1689512864508, 1045 | "link": null, 1046 | "locked": false, 1047 | "startBinding": null, 1048 | "endBinding": null, 1049 | "lastCommittedPoint": null, 1050 | "startArrowhead": null, 1051 | "endArrowhead": null, 1052 | "points": [ 1053 | [ 1054 | 0, 1055 | 0 1056 | ], 1057 | [ 1058 | 0, 1059 | 18 1060 | ] 1061 | ] 1062 | }, 1063 | { 1064 | "type": "line", 1065 | "version": 670, 1066 | "versionNonce": 1509162047, 1067 | "isDeleted": false, 1068 | "id": "W3ncSIEXccF-ADdutfeun", 1069 | "fillStyle": "solid", 1070 | "strokeWidth": 2, 1071 | "strokeStyle": "solid", 1072 | "roughness": 0, 1073 | "opacity": 100, 1074 | "angle": 0, 1075 | "x": 1871.7088641016753, 1076 | "y": 10505.928885006853, 1077 | "strokeColor": "#1e1e1e", 1078 | "backgroundColor": "transparent", 1079 | "width": 0, 1080 | "height": 18, 1081 | "seed": 647577439, 1082 | "groupIds": [], 1083 | "frameId": null, 1084 | "roundness": null, 1085 | "boundElements": [], 1086 | "updated": 1689512864508, 1087 | "link": null, 1088 | "locked": false, 1089 | "startBinding": null, 1090 | "endBinding": null, 1091 | "lastCommittedPoint": null, 1092 | "startArrowhead": null, 1093 | "endArrowhead": null, 1094 | "points": [ 1095 | [ 1096 | 0, 1097 | 0 1098 | ], 1099 | [ 1100 | 0, 1101 | 18 1102 | ] 1103 | ] 1104 | }, 1105 | { 1106 | "type": "line", 1107 | "version": 713, 1108 | "versionNonce": 1820863281, 1109 | "isDeleted": false, 1110 | "id": "_8oqYK8wik6jXD4nbpDL7", 1111 | "fillStyle": "solid", 1112 | "strokeWidth": 2, 1113 | "strokeStyle": "solid", 1114 | "roughness": 0, 1115 | "opacity": 100, 1116 | "angle": 0, 1117 | "x": 1912.3755307683423, 1118 | "y": 10505.595551673521, 1119 | "strokeColor": "#1e1e1e", 1120 | "backgroundColor": "transparent", 1121 | "width": 0, 1122 | "height": 18, 1123 | "seed": 1099969151, 1124 | "groupIds": [], 1125 | "frameId": null, 1126 | "roundness": null, 1127 | "boundElements": [], 1128 | "updated": 1689512864508, 1129 | "link": null, 1130 | "locked": false, 1131 | "startBinding": null, 1132 | "endBinding": null, 1133 | "lastCommittedPoint": null, 1134 | "startArrowhead": null, 1135 | "endArrowhead": null, 1136 | "points": [ 1137 | [ 1138 | 0, 1139 | 0 1140 | ], 1141 | [ 1142 | 0, 1143 | 18 1144 | ] 1145 | ] 1146 | }, 1147 | { 1148 | "type": "line", 1149 | "version": 752, 1150 | "versionNonce": 533208159, 1151 | "isDeleted": false, 1152 | "id": "9kIO36NjX2n061n6c2VB1", 1153 | "fillStyle": "solid", 1154 | "strokeWidth": 2, 1155 | "strokeStyle": "solid", 1156 | "roughness": 0, 1157 | "opacity": 100, 1158 | "angle": 0, 1159 | "x": 1953.708864101675, 1160 | "y": 10504.928885006853, 1161 | "strokeColor": "#1e1e1e", 1162 | "backgroundColor": "transparent", 1163 | "width": 0, 1164 | "height": 18, 1165 | "seed": 1363915761, 1166 | "groupIds": [], 1167 | "frameId": null, 1168 | "roundness": null, 1169 | "boundElements": [], 1170 | "updated": 1689512864508, 1171 | "link": null, 1172 | "locked": false, 1173 | "startBinding": null, 1174 | "endBinding": null, 1175 | "lastCommittedPoint": null, 1176 | "startArrowhead": null, 1177 | "endArrowhead": null, 1178 | "points": [ 1179 | [ 1180 | 0, 1181 | 0 1182 | ], 1183 | [ 1184 | 0, 1185 | 18 1186 | ] 1187 | ] 1188 | }, 1189 | { 1190 | "type": "line", 1191 | "version": 796, 1192 | "versionNonce": 899521809, 1193 | "isDeleted": false, 1194 | "id": "0Jlg0NhAQh8v80FqaPwr2", 1195 | "fillStyle": "solid", 1196 | "strokeWidth": 2, 1197 | "strokeStyle": "solid", 1198 | "roughness": 0, 1199 | "opacity": 100, 1200 | "angle": 0, 1201 | "x": 1995.0421974350088, 1202 | "y": 10504.928885006853, 1203 | "strokeColor": "#1e1e1e", 1204 | "backgroundColor": "transparent", 1205 | "width": 0, 1206 | "height": 18, 1207 | "seed": 1445092479, 1208 | "groupIds": [], 1209 | "frameId": null, 1210 | "roundness": null, 1211 | "boundElements": [], 1212 | "updated": 1689512864508, 1213 | "link": null, 1214 | "locked": false, 1215 | "startBinding": null, 1216 | "endBinding": null, 1217 | "lastCommittedPoint": null, 1218 | "startArrowhead": null, 1219 | "endArrowhead": null, 1220 | "points": [ 1221 | [ 1222 | 0, 1223 | 0 1224 | ], 1225 | [ 1226 | 0, 1227 | 18 1228 | ] 1229 | ] 1230 | }, 1231 | { 1232 | "id": "4BCMrQuYzACjEM-UGTxni", 1233 | "type": "text", 1234 | "x": 1823.7088641016753, 1235 | "y": 10528.262218340187, 1236 | "width": 13.759994506835938, 1237 | "height": 25, 1238 | "angle": 0, 1239 | "strokeColor": "#2f9e44", 1240 | "backgroundColor": "transparent", 1241 | "fillStyle": "solid", 1242 | "strokeWidth": 2, 1243 | "strokeStyle": "solid", 1244 | "roughness": 0, 1245 | "opacity": 100, 1246 | "groupIds": [], 1247 | "frameId": null, 1248 | "roundness": null, 1249 | "seed": 828196049, 1250 | "version": 313, 1251 | "versionNonce": 845363327, 1252 | "isDeleted": false, 1253 | "boundElements": null, 1254 | "updated": 1689512864508, 1255 | "link": null, 1256 | "locked": false, 1257 | "text": "0", 1258 | "fontSize": 20, 1259 | "fontFamily": 1, 1260 | "textAlign": "left", 1261 | "verticalAlign": "top", 1262 | "baseline": 18, 1263 | "containerId": null, 1264 | "originalText": "0", 1265 | "lineHeight": 1.25, 1266 | "isFrameName": false 1267 | }, 1268 | { 1269 | "id": "cW3voh51ISVVXiwcmzLex", 1270 | "type": "text", 1271 | "x": 1783.0421974350088, 1272 | "y": 10528.262218340187, 1273 | "width": 13.639984130859375, 1274 | "height": 25, 1275 | "angle": 0, 1276 | "strokeColor": "#2f9e44", 1277 | "backgroundColor": "transparent", 1278 | "fillStyle": "solid", 1279 | "strokeWidth": 2, 1280 | "strokeStyle": "solid", 1281 | "roughness": 0, 1282 | "opacity": 100, 1283 | "groupIds": [], 1284 | "frameId": null, 1285 | "roundness": null, 1286 | "seed": 900366513, 1287 | "version": 314, 1288 | "versionNonce": 48878321, 1289 | "isDeleted": false, 1290 | "boundElements": null, 1291 | "updated": 1689512864508, 1292 | "link": null, 1293 | "locked": false, 1294 | "text": "-1", 1295 | "fontSize": 20, 1296 | "fontFamily": 1, 1297 | "textAlign": "left", 1298 | "verticalAlign": "top", 1299 | "baseline": 18, 1300 | "containerId": null, 1301 | "originalText": "-1", 1302 | "lineHeight": 1.25, 1303 | "isFrameName": false 1304 | }, 1305 | { 1306 | "id": "xPwHwjmIngJrPcs-dKLDS", 1307 | "type": "text", 1308 | "x": 1737.042197435009, 1309 | "y": 10529.59555167352, 1310 | "width": 22.459976196289062, 1311 | "height": 25, 1312 | "angle": 0, 1313 | "strokeColor": "#2f9e44", 1314 | "backgroundColor": "transparent", 1315 | "fillStyle": "solid", 1316 | "strokeWidth": 2, 1317 | "strokeStyle": "solid", 1318 | "roughness": 0, 1319 | "opacity": 100, 1320 | "groupIds": [], 1321 | "frameId": null, 1322 | "roundness": null, 1323 | "seed": 2054397247, 1324 | "version": 338, 1325 | "versionNonce": 1468387487, 1326 | "isDeleted": false, 1327 | "boundElements": null, 1328 | "updated": 1689512864508, 1329 | "link": null, 1330 | "locked": false, 1331 | "text": "-2", 1332 | "fontSize": 20, 1333 | "fontFamily": 1, 1334 | "textAlign": "left", 1335 | "verticalAlign": "top", 1336 | "baseline": 18, 1337 | "containerId": null, 1338 | "originalText": "-2", 1339 | "lineHeight": 1.25, 1340 | "isFrameName": false 1341 | }, 1342 | { 1343 | "id": "qliD6tVYdsSghiW-C719M", 1344 | "type": "text", 1345 | "x": 1697.7088641016758, 1346 | "y": 10529.59555167352, 1347 | "width": 21.8399658203125, 1348 | "height": 25, 1349 | "angle": 0, 1350 | "strokeColor": "#2f9e44", 1351 | "backgroundColor": "transparent", 1352 | "fillStyle": "solid", 1353 | "strokeWidth": 2, 1354 | "strokeStyle": "solid", 1355 | "roughness": 0, 1356 | "opacity": 100, 1357 | "groupIds": [], 1358 | "frameId": null, 1359 | "roundness": null, 1360 | "seed": 1085011377, 1361 | "version": 320, 1362 | "versionNonce": 687099089, 1363 | "isDeleted": false, 1364 | "boundElements": null, 1365 | "updated": 1689512864508, 1366 | "link": null, 1367 | "locked": false, 1368 | "text": "-3", 1369 | "fontSize": 20, 1370 | "fontFamily": 1, 1371 | "textAlign": "left", 1372 | "verticalAlign": "top", 1373 | "baseline": 18, 1374 | "containerId": null, 1375 | "originalText": "-3", 1376 | "lineHeight": 1.25, 1377 | "isFrameName": false 1378 | }, 1379 | { 1380 | "id": "0RNzM1zAz5v8O4aeqSCZE", 1381 | "type": "text", 1382 | "x": 1659.7088641016755, 1383 | "y": 10529.59555167352, 1384 | "width": 21.019973754882812, 1385 | "height": 25, 1386 | "angle": 0, 1387 | "strokeColor": "#2f9e44", 1388 | "backgroundColor": "transparent", 1389 | "fillStyle": "solid", 1390 | "strokeWidth": 2, 1391 | "strokeStyle": "solid", 1392 | "roughness": 0, 1393 | "opacity": 100, 1394 | "groupIds": [], 1395 | "frameId": null, 1396 | "roundness": null, 1397 | "seed": 1498686783, 1398 | "version": 343, 1399 | "versionNonce": 1222665407, 1400 | "isDeleted": false, 1401 | "boundElements": null, 1402 | "updated": 1689512864508, 1403 | "link": null, 1404 | "locked": false, 1405 | "text": "-4", 1406 | "fontSize": 20, 1407 | "fontFamily": 1, 1408 | "textAlign": "left", 1409 | "verticalAlign": "top", 1410 | "baseline": 18, 1411 | "containerId": null, 1412 | "originalText": "-4", 1413 | "lineHeight": 1.25, 1414 | "isFrameName": false 1415 | }, 1416 | { 1417 | "id": "8JWn7-Dndu-INxevBQlIl", 1418 | "type": "text", 1419 | "x": 1869.0421974350083, 1420 | "y": 10527.928885006851, 1421 | "width": 5.4199981689453125, 1422 | "height": 25, 1423 | "angle": 0, 1424 | "strokeColor": "#2f9e44", 1425 | "backgroundColor": "transparent", 1426 | "fillStyle": "solid", 1427 | "strokeWidth": 2, 1428 | "strokeStyle": "solid", 1429 | "roughness": 0, 1430 | "opacity": 100, 1431 | "groupIds": [], 1432 | "frameId": null, 1433 | "roundness": null, 1434 | "seed": 1258867455, 1435 | "version": 279, 1436 | "versionNonce": 2136246961, 1437 | "isDeleted": false, 1438 | "boundElements": null, 1439 | "updated": 1689512864508, 1440 | "link": null, 1441 | "locked": false, 1442 | "text": "1", 1443 | "fontSize": 20, 1444 | "fontFamily": 1, 1445 | "textAlign": "left", 1446 | "verticalAlign": "top", 1447 | "baseline": 18, 1448 | "containerId": null, 1449 | "originalText": "1", 1450 | "lineHeight": 1.25, 1451 | "isFrameName": false 1452 | }, 1453 | { 1454 | "id": "sSa4Ou1L78BgNqKwzpLv-", 1455 | "type": "text", 1456 | "x": 1905.042197435009, 1457 | "y": 10527.928885006853, 1458 | "width": 14.239990234375, 1459 | "height": 25, 1460 | "angle": 0, 1461 | "strokeColor": "#2f9e44", 1462 | "backgroundColor": "transparent", 1463 | "fillStyle": "solid", 1464 | "strokeWidth": 2, 1465 | "strokeStyle": "solid", 1466 | "roughness": 0, 1467 | "opacity": 100, 1468 | "groupIds": [], 1469 | "frameId": null, 1470 | "roundness": null, 1471 | "seed": 1736510015, 1472 | "version": 292, 1473 | "versionNonce": 907244767, 1474 | "isDeleted": false, 1475 | "boundElements": null, 1476 | "updated": 1689512864508, 1477 | "link": null, 1478 | "locked": false, 1479 | "text": "2", 1480 | "fontSize": 20, 1481 | "fontFamily": 1, 1482 | "textAlign": "left", 1483 | "verticalAlign": "top", 1484 | "baseline": 18, 1485 | "containerId": null, 1486 | "originalText": "2", 1487 | "lineHeight": 1.25, 1488 | "isFrameName": false 1489 | }, 1490 | { 1491 | "id": "UvY2gKqtaSiIwpud2NZC9", 1492 | "type": "text", 1493 | "x": 1947.0421974350086, 1494 | "y": 10527.262218340187, 1495 | "width": 13.619979858398438, 1496 | "height": 25, 1497 | "angle": 0, 1498 | "strokeColor": "#2f9e44", 1499 | "backgroundColor": "transparent", 1500 | "fillStyle": "solid", 1501 | "strokeWidth": 2, 1502 | "strokeStyle": "solid", 1503 | "roughness": 0, 1504 | "opacity": 100, 1505 | "groupIds": [], 1506 | "frameId": null, 1507 | "roundness": null, 1508 | "seed": 1575396575, 1509 | "version": 292, 1510 | "versionNonce": 2125597841, 1511 | "isDeleted": false, 1512 | "boundElements": null, 1513 | "updated": 1689512864508, 1514 | "link": null, 1515 | "locked": false, 1516 | "text": "3", 1517 | "fontSize": 20, 1518 | "fontFamily": 1, 1519 | "textAlign": "left", 1520 | "verticalAlign": "top", 1521 | "baseline": 18, 1522 | "containerId": null, 1523 | "originalText": "3", 1524 | "lineHeight": 1.25, 1525 | "isFrameName": false 1526 | }, 1527 | { 1528 | "id": "eH2cG9gsOgImY6_vG8Jv4", 1529 | "type": "text", 1530 | "x": 1988.375530768342, 1531 | "y": 10527.928885006851, 1532 | "width": 12.79998779296875, 1533 | "height": 25, 1534 | "angle": 0, 1535 | "strokeColor": "#2f9e44", 1536 | "backgroundColor": "transparent", 1537 | "fillStyle": "solid", 1538 | "strokeWidth": 2, 1539 | "strokeStyle": "solid", 1540 | "roughness": 0, 1541 | "opacity": 100, 1542 | "groupIds": [], 1543 | "frameId": null, 1544 | "roundness": null, 1545 | "seed": 1048469489, 1546 | "version": 285, 1547 | "versionNonce": 112165119, 1548 | "isDeleted": false, 1549 | "boundElements": null, 1550 | "updated": 1689512864508, 1551 | "link": null, 1552 | "locked": false, 1553 | "text": "4", 1554 | "fontSize": 20, 1555 | "fontFamily": 1, 1556 | "textAlign": "left", 1557 | "verticalAlign": "top", 1558 | "baseline": 18, 1559 | "containerId": null, 1560 | "originalText": "4", 1561 | "lineHeight": 1.25, 1562 | "isFrameName": false 1563 | }, 1564 | { 1565 | "id": "nE4rkwX6fIACwLKNJRfzm", 1566 | "type": "line", 1567 | "x": 1830.7088641016753, 1568 | "y": 10468.59555167352, 1569 | "width": 0, 1570 | "height": 45.33333333333394, 1571 | "angle": 0, 1572 | "strokeColor": "#2f9e44", 1573 | "backgroundColor": "transparent", 1574 | "fillStyle": "solid", 1575 | "strokeWidth": 2, 1576 | "strokeStyle": "dashed", 1577 | "roughness": 0, 1578 | "opacity": 100, 1579 | "groupIds": [], 1580 | "frameId": null, 1581 | "roundness": null, 1582 | "seed": 1216745169, 1583 | "version": 339, 1584 | "versionNonce": 516182641, 1585 | "isDeleted": false, 1586 | "boundElements": null, 1587 | "updated": 1689512864508, 1588 | "link": null, 1589 | "locked": false, 1590 | "points": [ 1591 | [ 1592 | 0, 1593 | 0 1594 | ], 1595 | [ 1596 | 0, 1597 | 45.33333333333394 1598 | ] 1599 | ], 1600 | "lastCommittedPoint": null, 1601 | "startBinding": null, 1602 | "endBinding": null, 1603 | "startArrowhead": null, 1604 | "endArrowhead": null 1605 | }, 1606 | { 1607 | "type": "line", 1608 | "version": 378, 1609 | "versionNonce": 1546979615, 1610 | "isDeleted": false, 1611 | "id": "rSfXegm7dPCxj3XUcJZ5E", 1612 | "fillStyle": "solid", 1613 | "strokeWidth": 2, 1614 | "strokeStyle": "dashed", 1615 | "roughness": 0, 1616 | "opacity": 100, 1617 | "angle": 0, 1618 | "x": 1912.0421974350086, 1619 | "y": 10468.59555167352, 1620 | "strokeColor": "#2f9e44", 1621 | "backgroundColor": "transparent", 1622 | "width": 0, 1623 | "height": 45.33333333333394, 1624 | "seed": 1714883441, 1625 | "groupIds": [], 1626 | "frameId": null, 1627 | "roundness": null, 1628 | "boundElements": [], 1629 | "updated": 1689512864508, 1630 | "link": null, 1631 | "locked": false, 1632 | "startBinding": null, 1633 | "endBinding": null, 1634 | "lastCommittedPoint": null, 1635 | "startArrowhead": null, 1636 | "endArrowhead": null, 1637 | "points": [ 1638 | [ 1639 | 0, 1640 | 0 1641 | ], 1642 | [ 1643 | 0, 1644 | 45.33333333333394 1645 | ] 1646 | ] 1647 | }, 1648 | { 1649 | "type": "line", 1650 | "version": 419, 1651 | "versionNonce": 1951587409, 1652 | "isDeleted": false, 1653 | "id": "fggv3ae2EnvtFe2bX-Ch6", 1654 | "fillStyle": "solid", 1655 | "strokeWidth": 2, 1656 | "strokeStyle": "dashed", 1657 | "roughness": 0, 1658 | "opacity": 100, 1659 | "angle": 0, 1660 | "x": 1995.3755307683418, 1661 | "y": 10468.595551673518, 1662 | "strokeColor": "#2f9e44", 1663 | "backgroundColor": "transparent", 1664 | "width": 0.6666666666669698, 1665 | "height": 45.33333333333394, 1666 | "seed": 603183423, 1667 | "groupIds": [], 1668 | "frameId": null, 1669 | "roundness": null, 1670 | "boundElements": [], 1671 | "updated": 1689512864508, 1672 | "link": null, 1673 | "locked": false, 1674 | "startBinding": null, 1675 | "endBinding": null, 1676 | "lastCommittedPoint": null, 1677 | "startArrowhead": null, 1678 | "endArrowhead": null, 1679 | "points": [ 1680 | [ 1681 | 0, 1682 | 0 1683 | ], 1684 | [ 1685 | -0.6666666666669698, 1686 | 45.33333333333394 1687 | ] 1688 | ] 1689 | }, 1690 | { 1691 | "type": "line", 1692 | "version": 421, 1693 | "versionNonce": 1410633023, 1694 | "isDeleted": false, 1695 | "id": "GUXhz8vZ2hiP7BBBHt2pR", 1696 | "fillStyle": "solid", 1697 | "strokeWidth": 2, 1698 | "strokeStyle": "dashed", 1699 | "roughness": 0, 1700 | "opacity": 100, 1701 | "angle": 0, 1702 | "x": 1749.375530768342, 1703 | "y": 10468.595551673523, 1704 | "strokeColor": "#2f9e44", 1705 | "backgroundColor": "transparent", 1706 | "width": 0, 1707 | "height": 45.33333333333394, 1708 | "seed": 1976098193, 1709 | "groupIds": [], 1710 | "frameId": null, 1711 | "roundness": null, 1712 | "boundElements": [], 1713 | "updated": 1689512864508, 1714 | "link": null, 1715 | "locked": false, 1716 | "startBinding": null, 1717 | "endBinding": null, 1718 | "lastCommittedPoint": null, 1719 | "startArrowhead": null, 1720 | "endArrowhead": null, 1721 | "points": [ 1722 | [ 1723 | 0, 1724 | 0 1725 | ], 1726 | [ 1727 | 0, 1728 | 45.33333333333394 1729 | ] 1730 | ] 1731 | }, 1732 | { 1733 | "type": "line", 1734 | "version": 472, 1735 | "versionNonce": 255142449, 1736 | "isDeleted": false, 1737 | "id": "BhRRCNAmy8z2-oHn4vlf6", 1738 | "fillStyle": "solid", 1739 | "strokeWidth": 2, 1740 | "strokeStyle": "dashed", 1741 | "roughness": 0, 1742 | "opacity": 100, 1743 | "angle": 0, 1744 | "x": 1670.7088641016753, 1745 | "y": 10468.59555167352, 1746 | "strokeColor": "#2f9e44", 1747 | "backgroundColor": "transparent", 1748 | "width": 0, 1749 | "height": 45.33333333333394, 1750 | "seed": 716957407, 1751 | "groupIds": [], 1752 | "frameId": null, 1753 | "roundness": null, 1754 | "boundElements": [], 1755 | "updated": 1689512864508, 1756 | "link": null, 1757 | "locked": false, 1758 | "startBinding": null, 1759 | "endBinding": null, 1760 | "lastCommittedPoint": null, 1761 | "startArrowhead": null, 1762 | "endArrowhead": null, 1763 | "points": [ 1764 | [ 1765 | 0, 1766 | 0 1767 | ], 1768 | [ 1769 | 0, 1770 | 45.33333333333394 1771 | ] 1772 | ] 1773 | }, 1774 | { 1775 | "id": "Wk5RgD93v78QJbg7BpENL", 1776 | "type": "text", 1777 | "x": 1605.0421974350083, 1778 | "y": 10317.59555167352, 1779 | "width": 17.276077270507812, 1780 | "height": 35, 1781 | "angle": 0, 1782 | "strokeColor": "#1e1e1e", 1783 | "backgroundColor": "transparent", 1784 | "fillStyle": "solid", 1785 | "strokeWidth": 2, 1786 | "strokeStyle": "dashed", 1787 | "roughness": 0, 1788 | "opacity": 100, 1789 | "groupIds": [], 1790 | "frameId": null, 1791 | "roundness": null, 1792 | "seed": 821329087, 1793 | "version": 55, 1794 | "versionNonce": 836602929, 1795 | "isDeleted": false, 1796 | "boundElements": null, 1797 | "updated": 1689512720908, 1798 | "link": null, 1799 | "locked": false, 1800 | "text": "=", 1801 | "fontSize": 28, 1802 | "fontFamily": 1, 1803 | "textAlign": "left", 1804 | "verticalAlign": "top", 1805 | "baseline": 25, 1806 | "containerId": null, 1807 | "originalText": "=", 1808 | "lineHeight": 1.25, 1809 | "isFrameName": false 1810 | }, 1811 | { 1812 | "id": "moDVRjqFQ3G8emtHisuQm", 1813 | "type": "text", 1814 | "x": 1640.3755307683416, 1815 | "y": 10315.262218340187, 1816 | "width": 623.3106689453125, 1817 | "height": 35, 1818 | "angle": 0, 1819 | "strokeColor": "#1e1e1e", 1820 | "backgroundColor": "transparent", 1821 | "fillStyle": "solid", 1822 | "strokeWidth": 2, 1823 | "strokeStyle": "dashed", 1824 | "roughness": 0, 1825 | "opacity": 100, 1826 | "groupIds": [], 1827 | "frameId": null, 1828 | "roundness": null, 1829 | "seed": 1505962513, 1830 | "version": 121, 1831 | "versionNonce": 1154508305, 1832 | "isDeleted": false, 1833 | "boundElements": null, 1834 | "updated": 1689512952801, 1835 | "link": null, 1836 | "locked": false, 1837 | "text": "Number of ticks to skip when the price moves", 1838 | "fontSize": 28, 1839 | "fontFamily": 1, 1840 | "textAlign": "left", 1841 | "verticalAlign": "top", 1842 | "baseline": 25, 1843 | "containerId": null, 1844 | "originalText": "Number of ticks to skip when the price moves", 1845 | "lineHeight": 1.25, 1846 | "isFrameName": false 1847 | }, 1848 | { 1849 | "id": "YQeaWBQIkU97q0iIp5N7z", 1850 | "type": "text", 1851 | "x": 1645.0421974350083, 1852 | "y": 10380.595551673518, 1853 | "width": 107.49246215820312, 1854 | "height": 35, 1855 | "angle": 0, 1856 | "strokeColor": "#1e1e1e", 1857 | "backgroundColor": "transparent", 1858 | "fillStyle": "solid", 1859 | "strokeWidth": 2, 1860 | "strokeStyle": "dashed", 1861 | "roughness": 0, 1862 | "opacity": 100, 1863 | "groupIds": [], 1864 | "frameId": null, 1865 | "roundness": null, 1866 | "seed": 1759356799, 1867 | "version": 51, 1868 | "versionNonce": 873472511, 1869 | "isDeleted": false, 1870 | "boundElements": null, 1871 | "updated": 1689512860742, 1872 | "link": null, 1873 | "locked": false, 1874 | "text": "Example", 1875 | "fontSize": 28, 1876 | "fontFamily": 1, 1877 | "textAlign": "left", 1878 | "verticalAlign": "top", 1879 | "baseline": 25, 1880 | "containerId": null, 1881 | "originalText": "Example", 1882 | "lineHeight": 1.25, 1883 | "isFrameName": false 1884 | }, 1885 | { 1886 | "id": "V91rsLWBQGeDx6HHMg1kx", 1887 | "type": "line", 1888 | "x": 1637.0421974350083, 1889 | "y": 10415.928885006853, 1890 | "width": 128.66666666666652, 1891 | "height": 0.6666666666660603, 1892 | "angle": 0, 1893 | "strokeColor": "#1e1e1e", 1894 | "backgroundColor": "transparent", 1895 | "fillStyle": "solid", 1896 | "strokeWidth": 2, 1897 | "strokeStyle": "solid", 1898 | "roughness": 0, 1899 | "opacity": 100, 1900 | "groupIds": [], 1901 | "frameId": null, 1902 | "roundness": null, 1903 | "seed": 966463999, 1904 | "version": 108, 1905 | "versionNonce": 1845117297, 1906 | "isDeleted": false, 1907 | "boundElements": null, 1908 | "updated": 1689512860742, 1909 | "link": null, 1910 | "locked": false, 1911 | "points": [ 1912 | [ 1913 | 0, 1914 | 0 1915 | ], 1916 | [ 1917 | 128.66666666666652, 1918 | -0.6666666666660603 1919 | ] 1920 | ], 1921 | "lastCommittedPoint": null, 1922 | "startBinding": null, 1923 | "endBinding": null, 1924 | "startArrowhead": null, 1925 | "endArrowhead": null 1926 | }, 1927 | { 1928 | "id": "d2Mj3h1NrWGrLJQR800Az", 1929 | "type": "text", 1930 | "x": 1801.0421974350083, 1931 | "y": 10385.928885006853, 1932 | "width": 158.6206512451172, 1933 | "height": 35, 1934 | "angle": 0, 1935 | "strokeColor": "#2f9e44", 1936 | "backgroundColor": "transparent", 1937 | "fillStyle": "solid", 1938 | "strokeWidth": 2, 1939 | "strokeStyle": "solid", 1940 | "roughness": 0, 1941 | "opacity": 100, 1942 | "groupIds": [], 1943 | "frameId": null, 1944 | "roundness": null, 1945 | "seed": 799216113, 1946 | "version": 14, 1947 | "versionNonce": 1096023647, 1948 | "isDeleted": false, 1949 | "boundElements": null, 1950 | "updated": 1689512872339, 1951 | "link": null, 1952 | "locked": false, 1953 | "text": "tick spacing", 1954 | "fontSize": 28, 1955 | "fontFamily": 1, 1956 | "textAlign": "left", 1957 | "verticalAlign": "top", 1958 | "baseline": 25, 1959 | "containerId": null, 1960 | "originalText": "tick spacing", 1961 | "lineHeight": 1.25, 1962 | "isFrameName": false 1963 | }, 1964 | { 1965 | "type": "text", 1966 | "version": 104, 1967 | "versionNonce": 1132275665, 1968 | "isDeleted": false, 1969 | "id": "HB25Eusn_Z6ipOhGkMg-4", 1970 | "fillStyle": "solid", 1971 | "strokeWidth": 2, 1972 | "strokeStyle": "dashed", 1973 | "roughness": 0, 1974 | "opacity": 100, 1975 | "angle": 0, 1976 | "x": 1973.0708254664212, 1977 | "y": 10386.428885006855, 1978 | "strokeColor": "#1e1e1e", 1979 | "backgroundColor": "transparent", 1980 | "width": 17.276077270507812, 1981 | "height": 35, 1982 | "seed": 218182303, 1983 | "groupIds": [], 1984 | "frameId": null, 1985 | "roundness": null, 1986 | "boundElements": [], 1987 | "updated": 1689512879535, 1988 | "link": null, 1989 | "locked": false, 1990 | "fontSize": 28, 1991 | "fontFamily": 1, 1992 | "text": "=", 1993 | "textAlign": "left", 1994 | "verticalAlign": "top", 1995 | "containerId": null, 1996 | "originalText": "=", 1997 | "lineHeight": 1.25, 1998 | "baseline": 25 1999 | }, 2000 | { 2001 | "id": "PyUjxOajIGmYeNnlpReKV", 2002 | "type": "text", 2003 | "x": 2000.3755307683418, 2004 | "y": 10389.928885006853, 2005 | "width": 19.936080932617188, 2006 | "height": 35, 2007 | "angle": 0, 2008 | "strokeColor": "#2f9e44", 2009 | "backgroundColor": "transparent", 2010 | "fillStyle": "solid", 2011 | "strokeWidth": 2, 2012 | "strokeStyle": "solid", 2013 | "roughness": 0, 2014 | "opacity": 100, 2015 | "groupIds": [], 2016 | "frameId": null, 2017 | "roundness": null, 2018 | "seed": 1258301329, 2019 | "version": 38, 2020 | "versionNonce": 668968031, 2021 | "isDeleted": false, 2022 | "boundElements": null, 2023 | "updated": 1689512883760, 2024 | "link": null, 2025 | "locked": false, 2026 | "text": "2", 2027 | "fontSize": 28, 2028 | "fontFamily": 1, 2029 | "textAlign": "left", 2030 | "verticalAlign": "top", 2031 | "baseline": 25, 2032 | "containerId": null, 2033 | "originalText": "2", 2034 | "lineHeight": 1.25, 2035 | "isFrameName": false 2036 | } 2037 | ], 2038 | "appState": { 2039 | "gridSize": null, 2040 | "viewBackgroundColor": "#ffffff" 2041 | }, 2042 | "files": {} 2043 | } -------------------------------------------------------------------------------- /excalidraw/uni-v3/clamm/clamm-0-price-tick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/clamm/clamm-0-price-tick.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/clamm/clamm-1-sqrt-price-x-96.excalidraw: -------------------------------------------------------------------------------- 1 | { 2 | "type": "excalidraw", 3 | "version": 2, 4 | "source": "https://excalidraw.com", 5 | "elements": [ 6 | { 7 | "type": "text", 8 | "version": 349, 9 | "versionNonce": 746372307, 10 | "isDeleted": false, 11 | "id": "0ROfIW68A7sIEy3WA4Bfo", 12 | "fillStyle": "hachure", 13 | "strokeWidth": 1, 14 | "strokeStyle": "solid", 15 | "roughness": 0, 16 | "opacity": 100, 17 | "angle": 0, 18 | "x": 1387.1380612143935, 19 | "y": 9959.246523208998, 20 | "strokeColor": "#000000", 21 | "backgroundColor": "#c92a2a", 22 | "width": 439.20013427734375, 23 | "height": 45, 24 | "seed": 1259805291, 25 | "groupIds": [], 26 | "frameId": null, 27 | "roundness": null, 28 | "boundElements": [], 29 | "updated": 1689166218795, 30 | "link": null, 31 | "locked": false, 32 | "fontSize": 36, 33 | "fontFamily": 1, 34 | "text": "Uniswap V3 sqrtPriceX96", 35 | "textAlign": "left", 36 | "verticalAlign": "top", 37 | "containerId": null, 38 | "originalText": "Uniswap V3 sqrtPriceX96", 39 | "lineHeight": 1.25, 40 | "baseline": 32 41 | }, 42 | { 43 | "type": "line", 44 | "version": 498, 45 | "versionNonce": 138161235, 46 | "isDeleted": false, 47 | "id": "E3zcwnEdB001SvhWOF03M", 48 | "fillStyle": "hachure", 49 | "strokeWidth": 2, 50 | "strokeStyle": "solid", 51 | "roughness": 0, 52 | "opacity": 100, 53 | "angle": 0, 54 | "x": 1386.471394547727, 55 | "y": 10000.413189875664, 56 | "strokeColor": "#000000", 57 | "backgroundColor": "transparent", 58 | "width": 450.848484848485, 59 | "height": 0.24242424242402194, 60 | "seed": 1686260619, 61 | "groupIds": [], 62 | "frameId": null, 63 | "roundness": null, 64 | "boundElements": [], 65 | "updated": 1689166389951, 66 | "link": null, 67 | "locked": false, 68 | "startBinding": null, 69 | "endBinding": null, 70 | "lastCommittedPoint": null, 71 | "startArrowhead": null, 72 | "endArrowhead": null, 73 | "points": [ 74 | [ 75 | 0, 76 | 0 77 | ], 78 | [ 79 | 450.848484848485, 80 | -0.24242424242402194 81 | ] 82 | ] 83 | }, 84 | { 85 | "type": "text", 86 | "version": 1765, 87 | "versionNonce": 1424286109, 88 | "isDeleted": false, 89 | "id": "rlNIzFQOh5nnw7Bmk0LSw", 90 | "fillStyle": "hachure", 91 | "strokeWidth": 2, 92 | "strokeStyle": "dashed", 93 | "roughness": 0, 94 | "opacity": 100, 95 | "angle": 0, 96 | "x": 1561.3523865773786, 97 | "y": 10384.241722549737, 98 | "strokeColor": "#c2255c", 99 | "backgroundColor": "transparent", 100 | "width": 176.12074279785156, 101 | "height": 35, 102 | "seed": 441689350, 103 | "groupIds": [], 104 | "frameId": null, 105 | "roundness": null, 106 | "boundElements": [], 107 | "updated": 1689166583062, 108 | "link": null, 109 | "locked": false, 110 | "fontSize": 28, 111 | "fontFamily": 1, 112 | "text": "sqrtPriceX96", 113 | "textAlign": "left", 114 | "verticalAlign": "top", 115 | "containerId": null, 116 | "originalText": "sqrtPriceX96", 117 | "lineHeight": 1.25, 118 | "baseline": 25 119 | }, 120 | { 121 | "type": "text", 122 | "version": 1666, 123 | "versionNonce": 25776819, 124 | "isDeleted": false, 125 | "id": "YSG4O-f7WoaU-TMpzzwTV", 126 | "fillStyle": "hachure", 127 | "strokeWidth": 4, 128 | "strokeStyle": "solid", 129 | "roughness": 0, 130 | "opacity": 100, 131 | "angle": 0, 132 | "x": 1617.1857199107117, 133 | "y": 10424.24172254974, 134 | "strokeColor": "#e8590c", 135 | "backgroundColor": "transparent", 136 | "width": 54.71223449707031, 137 | "height": 35, 138 | "seed": 2078610502, 139 | "groupIds": [], 140 | "frameId": null, 141 | "roundness": null, 142 | "boundElements": [], 143 | "updated": 1689166583062, 144 | "link": null, 145 | "locked": false, 146 | "fontSize": 28, 147 | "fontFamily": 1, 148 | "text": "Q96", 149 | "textAlign": "left", 150 | "verticalAlign": "top", 151 | "containerId": null, 152 | "originalText": "Q96", 153 | "lineHeight": 1.25, 154 | "baseline": 25 155 | }, 156 | { 157 | "type": "text", 158 | "version": 1711, 159 | "versionNonce": 879797757, 160 | "isDeleted": false, 161 | "id": "47-bUKJlqgb_1AzM_cCOo", 162 | "fillStyle": "hachure", 163 | "strokeWidth": 2, 164 | "strokeStyle": "dashed", 165 | "roughness": 0, 166 | "opacity": 100, 167 | "angle": 0, 168 | "x": 1504.8523865773777, 169 | "y": 10402.24172254974, 170 | "strokeColor": "#000000", 171 | "backgroundColor": "transparent", 172 | "width": 17.276077270507812, 173 | "height": 35, 174 | "seed": 1876540186, 175 | "groupIds": [], 176 | "frameId": null, 177 | "roundness": null, 178 | "boundElements": [], 179 | "updated": 1689166583062, 180 | "link": null, 181 | "locked": false, 182 | "fontSize": 28, 183 | "fontFamily": 1, 184 | "text": "=", 185 | "textAlign": "left", 186 | "verticalAlign": "top", 187 | "containerId": null, 188 | "originalText": "=", 189 | "lineHeight": 1.25, 190 | "baseline": 25 191 | }, 192 | { 193 | "type": "text", 194 | "version": 1726, 195 | "versionNonce": 80905299, 196 | "isDeleted": false, 197 | "id": "gHLlXCJsBDoUUk7zIhx97", 198 | "fillStyle": "hachure", 199 | "strokeWidth": 2, 200 | "strokeStyle": "dashed", 201 | "roughness": 0, 202 | "opacity": 100, 203 | "angle": 0, 204 | "x": 1473.26147748647, 205 | "y": 10402.991722549734, 206 | "strokeColor": "#6741d9", 207 | "backgroundColor": "transparent", 208 | "width": 18.508071899414062, 209 | "height": 35, 210 | "seed": 1611045766, 211 | "groupIds": [], 212 | "frameId": null, 213 | "roundness": null, 214 | "boundElements": [], 215 | "updated": 1689166583062, 216 | "link": null, 217 | "locked": false, 218 | "fontSize": 28, 219 | "fontFamily": 1, 220 | "text": "P", 221 | "textAlign": "left", 222 | "verticalAlign": "top", 223 | "containerId": null, 224 | "originalText": "P", 225 | "lineHeight": 1.25, 226 | "baseline": 25 227 | }, 228 | { 229 | "type": "freedraw", 230 | "version": 1640, 231 | "versionNonce": 1254415965, 232 | "isDeleted": false, 233 | "id": "uFhsjOTvrI4aVb9NVQU4m", 234 | "fillStyle": "hachure", 235 | "strokeWidth": 1, 236 | "strokeStyle": "solid", 237 | "roughness": 0, 238 | "opacity": 100, 239 | "angle": 0, 240 | "x": 1549.6857199107126, 241 | "y": 10390.408389216404, 242 | "strokeColor": "#000000", 243 | "backgroundColor": "transparent", 244 | "width": 10, 245 | "height": 60, 246 | "seed": 2112309210, 247 | "groupIds": [], 248 | "frameId": null, 249 | "roundness": null, 250 | "boundElements": [], 251 | "updated": 1689166583062, 252 | "link": null, 253 | "locked": false, 254 | "points": [ 255 | [ 256 | 0, 257 | 0 258 | ], 259 | [ 260 | -0.6666666666665151, 261 | 0.6666666666678793 262 | ], 263 | [ 264 | -2, 265 | 2 266 | ], 267 | [ 268 | -2.666666666666515, 269 | 4 270 | ], 271 | [ 272 | -2.666666666666515, 273 | 4.666666666667879 274 | ], 275 | [ 276 | -3.3333333333332575, 277 | 5.33333333333394 278 | ], 279 | [ 280 | -3.3333333333332575, 281 | 6 282 | ], 283 | [ 284 | -4, 285 | 7.33333333333394 286 | ], 287 | [ 288 | -4, 289 | 9.33333333333394 290 | ], 291 | [ 292 | -4.666666666666515, 293 | 10.66666666666788 294 | ], 295 | [ 296 | -5.3333333333332575, 297 | 12 298 | ], 299 | [ 300 | -5.3333333333332575, 301 | 13.33333333333394 302 | ], 303 | [ 304 | -5.3333333333332575, 305 | 14.66666666666788 306 | ], 307 | [ 308 | -6, 309 | 15.33333333333394 310 | ], 311 | [ 312 | -6, 313 | 16 314 | ], 315 | [ 316 | -6, 317 | 18 318 | ], 319 | [ 320 | -6, 321 | 19.33333333333394 322 | ], 323 | [ 324 | -6, 325 | 20.66666666666788 326 | ], 327 | [ 328 | -6.666666666666515, 329 | 24 330 | ], 331 | [ 332 | -6.666666666666515, 333 | 25.33333333333394 334 | ], 335 | [ 336 | -6.666666666666515, 337 | 27.33333333333394 338 | ], 339 | [ 340 | -6.666666666666515, 341 | 28.66666666666788 342 | ], 343 | [ 344 | -6.666666666666515, 345 | 30 346 | ], 347 | [ 348 | -6.666666666666515, 349 | 31.33333333333394 350 | ], 351 | [ 352 | -6.666666666666515, 353 | 32.66666666666788 354 | ], 355 | [ 356 | -6.666666666666515, 357 | 34 358 | ], 359 | [ 360 | -6, 361 | 36 362 | ], 363 | [ 364 | -6, 365 | 38 366 | ], 367 | [ 368 | -6, 369 | 40 370 | ], 371 | [ 372 | -5.3333333333332575, 373 | 41.33333333333394 374 | ], 375 | [ 376 | -5.3333333333332575, 377 | 42 378 | ], 379 | [ 380 | -5.3333333333332575, 381 | 42.66666666666788 382 | ], 383 | [ 384 | -5.3333333333332575, 385 | 44 386 | ], 387 | [ 388 | -4.666666666666515, 389 | 44.66666666666788 390 | ], 391 | [ 392 | -4.666666666666515, 393 | 46 394 | ], 395 | [ 396 | -4, 397 | 46.66666666666788 398 | ], 399 | [ 400 | -3.3333333333332575, 401 | 48 402 | ], 403 | [ 404 | -3.3333333333332575, 405 | 49.33333333333394 406 | ], 407 | [ 408 | -2.666666666666515, 409 | 50.66666666666788 410 | ], 411 | [ 412 | -2, 413 | 51.33333333333394 414 | ], 415 | [ 416 | -1.3333333333332575, 417 | 52.66666666666788 418 | ], 419 | [ 420 | -0.6666666666665151, 421 | 54 422 | ], 423 | [ 424 | 0, 425 | 55.33333333333394 426 | ], 427 | [ 428 | 0.6666666666667425, 429 | 56.66666666666788 430 | ], 431 | [ 432 | 1.333333333333485, 433 | 57.33333333333394 434 | ], 435 | [ 436 | 2, 437 | 58 438 | ], 439 | [ 440 | 2, 441 | 58.66666666666788 442 | ], 443 | [ 444 | 2.6666666666667425, 445 | 58.66666666666788 446 | ], 447 | [ 448 | 2.6666666666667425, 449 | 59.33333333333394 450 | ], 451 | [ 452 | 3.333333333333485, 453 | 60 454 | ], 455 | [ 456 | 3.333333333333485, 457 | 60 458 | ] 459 | ], 460 | "lastCommittedPoint": null, 461 | "simulatePressure": true, 462 | "pressures": [] 463 | }, 464 | { 465 | "type": "freedraw", 466 | "version": 1666, 467 | "versionNonce": 1464107507, 468 | "isDeleted": false, 469 | "id": "RAN9LdQe7rIlVwMYHkebw", 470 | "fillStyle": "hachure", 471 | "strokeWidth": 1, 472 | "strokeStyle": "solid", 473 | "roughness": 0, 474 | "opacity": 100, 475 | "angle": 0, 476 | "x": 1746.3523865773784, 477 | "y": 10387.075055883071, 478 | "strokeColor": "#000000", 479 | "backgroundColor": "transparent", 480 | "width": 8.666666666666742, 481 | "height": 59.33333333333212, 482 | "seed": 754268870, 483 | "groupIds": [], 484 | "frameId": null, 485 | "roundness": null, 486 | "boundElements": [], 487 | "updated": 1689166583062, 488 | "link": null, 489 | "locked": false, 490 | "points": [ 491 | [ 492 | 0, 493 | 0 494 | ], 495 | [ 496 | 0, 497 | 0.6666666666660603 498 | ], 499 | [ 500 | 0.6666666666665151, 501 | 1.3333333333321207 502 | ], 503 | [ 504 | 1.3333333333332575, 505 | 2.6666666666660603 506 | ], 507 | [ 508 | 2, 509 | 3.3333333333321207 510 | ], 511 | [ 512 | 2.666666666666515, 513 | 4.66666666666606 514 | ], 515 | [ 516 | 2.666666666666515, 517 | 5.333333333332121 518 | ], 519 | [ 520 | 3.3333333333332575, 521 | 5.333333333332121 522 | ], 523 | [ 524 | 3.3333333333332575, 525 | 6.66666666666606 526 | ], 527 | [ 528 | 4, 529 | 7.333333333332121 530 | ], 531 | [ 532 | 4, 533 | 8 534 | ], 535 | [ 536 | 4.666666666666515, 537 | 9.33333333333212 538 | ], 539 | [ 540 | 5.3333333333332575, 541 | 9.33333333333212 542 | ], 543 | [ 544 | 5.3333333333332575, 545 | 10 546 | ], 547 | [ 548 | 5.3333333333332575, 549 | 11.33333333333212 550 | ], 551 | [ 552 | 6, 553 | 12 554 | ], 555 | [ 556 | 6, 557 | 14 558 | ], 559 | [ 560 | 6, 561 | 14.66666666666606 562 | ], 563 | [ 564 | 6.666666666666515, 565 | 15.33333333333212 566 | ], 567 | [ 568 | 6.666666666666515, 569 | 16.66666666666606 570 | ], 571 | [ 572 | 6.666666666666515, 573 | 18 574 | ], 575 | [ 576 | 7.3333333333332575, 577 | 19.33333333333212 578 | ], 579 | [ 580 | 7.3333333333332575, 581 | 20.66666666666606 582 | ], 583 | [ 584 | 7.3333333333332575, 585 | 21.33333333333212 586 | ], 587 | [ 588 | 7.3333333333332575, 589 | 22.66666666666606 590 | ], 591 | [ 592 | 7.3333333333332575, 593 | 23.33333333333212 594 | ], 595 | [ 596 | 7.3333333333332575, 597 | 24.66666666666606 598 | ], 599 | [ 600 | 7.3333333333332575, 601 | 26 602 | ], 603 | [ 604 | 8, 605 | 26.66666666666606 606 | ], 607 | [ 608 | 8, 609 | 28 610 | ], 611 | [ 612 | 8, 613 | 29.33333333333212 614 | ], 615 | [ 616 | 8, 617 | 30 618 | ], 619 | [ 620 | 8, 621 | 31.33333333333212 622 | ], 623 | [ 624 | 8, 625 | 32 626 | ], 627 | [ 628 | 8, 629 | 33.33333333333212 630 | ], 631 | [ 632 | 8, 633 | 34.66666666666606 634 | ], 635 | [ 636 | 8, 637 | 36.66666666666606 638 | ], 639 | [ 640 | 8, 641 | 38 642 | ], 643 | [ 644 | 8, 645 | 38.66666666666606 646 | ], 647 | [ 648 | 8, 649 | 39.33333333333212 650 | ], 651 | [ 652 | 7.3333333333332575, 653 | 40 654 | ], 655 | [ 656 | 7.3333333333332575, 657 | 40.66666666666606 658 | ], 659 | [ 660 | 7.3333333333332575, 661 | 42 662 | ], 663 | [ 664 | 6.666666666666515, 665 | 43.33333333333212 666 | ], 667 | [ 668 | 6.666666666666515, 669 | 44.66666666666606 670 | ], 671 | [ 672 | 6, 673 | 46 674 | ], 675 | [ 676 | 6, 677 | 46.66666666666606 678 | ], 679 | [ 680 | 6, 681 | 48 682 | ], 683 | [ 684 | 5.3333333333332575, 685 | 48.66666666666606 686 | ], 687 | [ 688 | 5.3333333333332575, 689 | 49.33333333333212 690 | ], 691 | [ 692 | 4.666666666666515, 693 | 50 694 | ], 695 | [ 696 | 4.666666666666515, 697 | 50.66666666666606 698 | ], 699 | [ 700 | 4, 701 | 51.33333333333212 702 | ], 703 | [ 704 | 4, 705 | 52 706 | ], 707 | [ 708 | 3.3333333333332575, 709 | 52.66666666666606 710 | ], 711 | [ 712 | 2.666666666666515, 713 | 53.33333333333212 714 | ], 715 | [ 716 | 2.666666666666515, 717 | 54 718 | ], 719 | [ 720 | 2, 721 | 54.66666666666606 722 | ], 723 | [ 724 | 2, 725 | 55.33333333333212 726 | ], 727 | [ 728 | 1.3333333333332575, 729 | 56 730 | ], 731 | [ 732 | 1.3333333333332575, 733 | 56.66666666666606 734 | ], 735 | [ 736 | 0.6666666666665151, 737 | 57.33333333333212 738 | ], 739 | [ 740 | 0.6666666666665151, 741 | 58 742 | ], 743 | [ 744 | 0, 745 | 58 746 | ], 747 | [ 748 | 0, 749 | 58.66666666666606 750 | ], 751 | [ 752 | -0.6666666666667425, 753 | 58.66666666666606 754 | ], 755 | [ 756 | -0.6666666666667425, 757 | 59.33333333333212 758 | ], 759 | [ 760 | -0.6666666666667425, 761 | 59.33333333333212 762 | ] 763 | ], 764 | "lastCommittedPoint": null, 765 | "simulatePressure": true, 766 | "pressures": [] 767 | }, 768 | { 769 | "type": "text", 770 | "version": 1604, 771 | "versionNonce": 246614717, 772 | "isDeleted": false, 773 | "id": "3b7ogYNuhx6t-nSsGFrB8", 774 | "fillStyle": "hachure", 775 | "strokeWidth": 1, 776 | "strokeStyle": "solid", 777 | "roughness": 0, 778 | "opacity": 100, 779 | "angle": 0, 780 | "x": 1757.0190532440445, 781 | "y": 10368.74172254974, 782 | "strokeColor": "#000000", 783 | "backgroundColor": "transparent", 784 | "width": 14.239990234375, 785 | "height": 25, 786 | "seed": 874855578, 787 | "groupIds": [], 788 | "frameId": null, 789 | "roundness": null, 790 | "boundElements": [], 791 | "updated": 1689166583062, 792 | "link": null, 793 | "locked": false, 794 | "fontSize": 20, 795 | "fontFamily": 1, 796 | "text": "2", 797 | "textAlign": "left", 798 | "verticalAlign": "top", 799 | "containerId": null, 800 | "originalText": "2", 801 | "lineHeight": 1.25, 802 | "baseline": 18 803 | }, 804 | { 805 | "type": "text", 806 | "version": 1722, 807 | "versionNonce": 837143443, 808 | "isDeleted": false, 809 | "id": "_sMo_gYm-ZgyAZ-7JS1kU", 810 | "fillStyle": "hachure", 811 | "strokeWidth": 4, 812 | "strokeStyle": "solid", 813 | "roughness": 0, 814 | "opacity": 100, 815 | "angle": 0, 816 | "x": 1473.216022941015, 817 | "y": 10332.196268004242, 818 | "strokeColor": "#e8590c", 819 | "backgroundColor": "transparent", 820 | "width": 54.71223449707031, 821 | "height": 35, 822 | "seed": 2035151366, 823 | "groupIds": [], 824 | "frameId": null, 825 | "roundness": null, 826 | "boundElements": [], 827 | "updated": 1689166583062, 828 | "link": null, 829 | "locked": false, 830 | "fontSize": 28, 831 | "fontFamily": 1, 832 | "text": "Q96", 833 | "textAlign": "left", 834 | "verticalAlign": "top", 835 | "containerId": null, 836 | "originalText": "Q96", 837 | "lineHeight": 1.25, 838 | "baseline": 25 839 | }, 840 | { 841 | "type": "text", 842 | "version": 1687, 843 | "versionNonce": 551332637, 844 | "isDeleted": false, 845 | "id": "lWxHo1_7OMOFL06mFMtLD", 846 | "fillStyle": "hachure", 847 | "strokeWidth": 4, 848 | "strokeStyle": "solid", 849 | "roughness": 0, 850 | "opacity": 100, 851 | "angle": 0, 852 | "x": 1544.549356274348, 853 | "y": 10331.529601337577, 854 | "strokeColor": "#000000", 855 | "backgroundColor": "transparent", 856 | "width": 17.276077270507812, 857 | "height": 35, 858 | "seed": 4626778, 859 | "groupIds": [], 860 | "frameId": null, 861 | "roundness": null, 862 | "boundElements": [], 863 | "updated": 1689166583062, 864 | "link": null, 865 | "locked": false, 866 | "fontSize": 28, 867 | "fontFamily": 1, 868 | "text": "=", 869 | "textAlign": "left", 870 | "verticalAlign": "top", 871 | "containerId": null, 872 | "originalText": "=", 873 | "lineHeight": 1.25, 874 | "baseline": 25 875 | }, 876 | { 877 | "type": "text", 878 | "version": 1727, 879 | "versionNonce": 1760354611, 880 | "isDeleted": false, 881 | "id": "j-HhmD0nVJOpMJZBNU9bU", 882 | "fillStyle": "hachure", 883 | "strokeWidth": 4, 884 | "strokeStyle": "solid", 885 | "roughness": 0, 886 | "opacity": 100, 887 | "angle": 0, 888 | "x": 1576.549356274348, 889 | "y": 10330.862934670908, 890 | "strokeColor": "#e8590c", 891 | "backgroundColor": "transparent", 892 | "width": 19.936080932617188, 893 | "height": 35, 894 | "seed": 901446, 895 | "groupIds": [], 896 | "frameId": null, 897 | "roundness": null, 898 | "boundElements": [], 899 | "updated": 1689166583062, 900 | "link": null, 901 | "locked": false, 902 | "fontSize": 28, 903 | "fontFamily": 1, 904 | "text": "2", 905 | "textAlign": "left", 906 | "verticalAlign": "top", 907 | "containerId": null, 908 | "originalText": "2", 909 | "lineHeight": 1.25, 910 | "baseline": 25 911 | }, 912 | { 913 | "type": "text", 914 | "version": 1718, 915 | "versionNonce": 296959869, 916 | "isDeleted": false, 917 | "id": "qJPD8Xtu9oJBCAVKRdbPw", 918 | "fillStyle": "hachure", 919 | "strokeWidth": 4, 920 | "strokeStyle": "solid", 921 | "roughness": 0, 922 | "opacity": 100, 923 | "angle": 0, 924 | "x": 1593.216022941014, 925 | "y": 10321.862934670908, 926 | "strokeColor": "#e8590c", 927 | "backgroundColor": "transparent", 928 | "width": 24.97998046875, 929 | "height": 25, 930 | "seed": 564026906, 931 | "groupIds": [], 932 | "frameId": null, 933 | "roundness": null, 934 | "boundElements": [], 935 | "updated": 1689166583062, 936 | "link": null, 937 | "locked": false, 938 | "fontSize": 20, 939 | "fontFamily": 1, 940 | "text": "96", 941 | "textAlign": "left", 942 | "verticalAlign": "top", 943 | "containerId": null, 944 | "originalText": "96", 945 | "lineHeight": 1.25, 946 | "baseline": 18 947 | }, 948 | { 949 | "type": "line", 950 | "version": 1746, 951 | "versionNonce": 96486099, 952 | "isDeleted": false, 953 | "id": "3SFz5f80BUX96DKYEoVZF", 954 | "fillStyle": "hachure", 955 | "strokeWidth": 2, 956 | "strokeStyle": "solid", 957 | "roughness": 0, 958 | "opacity": 100, 959 | "angle": 0, 960 | "x": 1558.6857199107126, 961 | "y": 10419.74172254974, 962 | "strokeColor": "#000000", 963 | "backgroundColor": "transparent", 964 | "width": 172.6666666666663, 965 | "height": 0, 966 | "seed": 568956506, 967 | "groupIds": [], 968 | "frameId": null, 969 | "roundness": null, 970 | "boundElements": [], 971 | "updated": 1689166583062, 972 | "link": null, 973 | "locked": false, 974 | "startBinding": null, 975 | "endBinding": null, 976 | "lastCommittedPoint": null, 977 | "startArrowhead": null, 978 | "endArrowhead": null, 979 | "points": [ 980 | [ 981 | 0, 982 | 0 983 | ], 984 | [ 985 | 172.6666666666663, 986 | 0 987 | ] 988 | ] 989 | }, 990 | { 991 | "type": "text", 992 | "version": 1788, 993 | "versionNonce": 1735935965, 994 | "isDeleted": false, 995 | "id": "uQFPPy4pv6-uUVAPYdKha", 996 | "fillStyle": "hachure", 997 | "strokeWidth": 2, 998 | "strokeStyle": "dashed", 999 | "roughness": 0, 1000 | "opacity": 100, 1001 | "angle": 0, 1002 | "x": 1474.5821415888524, 1003 | "y": 10265.994461928662, 1004 | "strokeColor": "#c2255c", 1005 | "backgroundColor": "transparent", 1006 | "width": 176.12074279785156, 1007 | "height": 35, 1008 | "seed": 518823059, 1009 | "groupIds": [], 1010 | "frameId": null, 1011 | "roundness": null, 1012 | "boundElements": [], 1013 | "updated": 1689166583062, 1014 | "link": null, 1015 | "locked": false, 1016 | "fontSize": 28, 1017 | "fontFamily": 1, 1018 | "text": "sqrtPriceX96", 1019 | "textAlign": "left", 1020 | "verticalAlign": "top", 1021 | "containerId": null, 1022 | "originalText": "sqrtPriceX96", 1023 | "lineHeight": 1.25, 1024 | "baseline": 25 1025 | }, 1026 | { 1027 | "type": "text", 1028 | "version": 1682, 1029 | "versionNonce": 553021555, 1030 | "isDeleted": false, 1031 | "id": "bBuF7PI7cGbQmAMhNTyG-", 1032 | "fillStyle": "hachure", 1033 | "strokeWidth": 4, 1034 | "strokeStyle": "solid", 1035 | "roughness": 0, 1036 | "opacity": 100, 1037 | "angle": 0, 1038 | "x": 1667.3378076858583, 1039 | "y": 10267.327795261996, 1040 | "strokeColor": "#000000", 1041 | "backgroundColor": "transparent", 1042 | "width": 17.276077270507812, 1043 | "height": 35, 1044 | "seed": 500617469, 1045 | "groupIds": [], 1046 | "frameId": null, 1047 | "roundness": null, 1048 | "boundElements": [], 1049 | "updated": 1689166583062, 1050 | "link": null, 1051 | "locked": false, 1052 | "fontSize": 28, 1053 | "fontFamily": 1, 1054 | "text": "=", 1055 | "textAlign": "left", 1056 | "verticalAlign": "top", 1057 | "containerId": null, 1058 | "originalText": "=", 1059 | "lineHeight": 1.25, 1060 | "baseline": 25 1061 | }, 1062 | { 1063 | "type": "text", 1064 | "version": 1748, 1065 | "versionNonce": 1681736765, 1066 | "isDeleted": false, 1067 | "id": "VeAYPI8stZFeY9utcI-yY", 1068 | "fillStyle": "hachure", 1069 | "strokeWidth": 2, 1070 | "strokeStyle": "dashed", 1071 | "roughness": 0, 1072 | "opacity": 100, 1073 | "angle": 0, 1074 | "x": 1724.0551437047372, 1075 | "y": 10265.994461928663, 1076 | "strokeColor": "#6741d9", 1077 | "backgroundColor": "transparent", 1078 | "width": 18.508071899414062, 1079 | "height": 35, 1080 | "seed": 985658557, 1081 | "groupIds": [], 1082 | "frameId": null, 1083 | "roundness": null, 1084 | "boundElements": [], 1085 | "updated": 1689166583062, 1086 | "link": null, 1087 | "locked": false, 1088 | "fontSize": 28, 1089 | "fontFamily": 1, 1090 | "text": "P", 1091 | "textAlign": "left", 1092 | "verticalAlign": "top", 1093 | "containerId": null, 1094 | "originalText": "P", 1095 | "lineHeight": 1.25, 1096 | "baseline": 25 1097 | }, 1098 | { 1099 | "id": "A-AGjyfT2cYSA_pJ6tsCW", 1100 | "type": "freedraw", 1101 | "x": 1703.3091796544452, 1102 | "y": 10282.16112859533, 1103 | "width": 9.333333333333258, 1104 | "height": 30, 1105 | "angle": 0, 1106 | "strokeColor": "#1e1e1e", 1107 | "backgroundColor": "transparent", 1108 | "fillStyle": "solid", 1109 | "strokeWidth": 1, 1110 | "strokeStyle": "solid", 1111 | "roughness": 0, 1112 | "opacity": 100, 1113 | "groupIds": [], 1114 | "frameId": null, 1115 | "roundness": null, 1116 | "seed": 1654401757, 1117 | "version": 284, 1118 | "versionNonce": 2086005267, 1119 | "isDeleted": false, 1120 | "boundElements": null, 1121 | "updated": 1689166583062, 1122 | "link": null, 1123 | "locked": false, 1124 | "points": [ 1125 | [ 1126 | 0, 1127 | 0 1128 | ], 1129 | [ 1130 | 0, 1131 | 0.6666666666660603 1132 | ], 1133 | [ 1134 | 0.6666666666667425, 1135 | 0.6666666666660603 1136 | ], 1137 | [ 1138 | 0.6666666666667425, 1139 | 1.3333333333321207 1140 | ], 1141 | [ 1142 | 0.6666666666667425, 1143 | 2 1144 | ], 1145 | [ 1146 | 1.3333333333332575, 1147 | 2.6666666666660603 1148 | ], 1149 | [ 1150 | 2, 1151 | 3.3333333333321207 1152 | ], 1153 | [ 1154 | 2.6666666666667425, 1155 | 4 1156 | ], 1157 | [ 1158 | 2.6666666666667425, 1159 | 5.333333333332121 1160 | ], 1161 | [ 1162 | 3.3333333333332575, 1163 | 6.66666666666606 1164 | ], 1165 | [ 1166 | 4, 1167 | 8 1168 | ], 1169 | [ 1170 | 4.6666666666667425, 1171 | 8.66666666666606 1172 | ], 1173 | [ 1174 | 4.6666666666667425, 1175 | 9.33333333333212 1176 | ], 1177 | [ 1178 | 5.3333333333332575, 1179 | 10 1180 | ], 1181 | [ 1182 | 5.3333333333332575, 1183 | 10.66666666666606 1184 | ], 1185 | [ 1186 | 5.3333333333332575, 1187 | 11.33333333333212 1188 | ], 1189 | [ 1190 | 6, 1191 | 12.66666666666606 1192 | ], 1193 | [ 1194 | 6.6666666666667425, 1195 | 13.33333333333212 1196 | ], 1197 | [ 1198 | 6.6666666666667425, 1199 | 12.66666666666606 1200 | ], 1201 | [ 1202 | 6.6666666666667425, 1203 | 11.33333333333212 1204 | ], 1205 | [ 1206 | 6.6666666666667425, 1207 | 10 1208 | ], 1209 | [ 1210 | 6.6666666666667425, 1211 | 7.333333333332121 1212 | ], 1213 | [ 1214 | 7.3333333333332575, 1215 | 3.3333333333321207 1216 | ], 1217 | [ 1218 | 8, 1219 | 0.6666666666660603 1220 | ], 1221 | [ 1222 | 8, 1223 | -1.3333333333339397 1224 | ], 1225 | [ 1226 | 8.666666666666742, 1227 | -3.3333333333339397 1228 | ], 1229 | [ 1230 | 8.666666666666742, 1231 | -4.666666666667879 1232 | ], 1233 | [ 1234 | 8.666666666666742, 1235 | -6.666666666667879 1236 | ], 1237 | [ 1238 | 8.666666666666742, 1239 | -9.33333333333394 1240 | ], 1241 | [ 1242 | 8.666666666666742, 1243 | -11.33333333333394 1244 | ], 1245 | [ 1246 | 9.333333333333258, 1247 | -13.33333333333394 1248 | ], 1249 | [ 1250 | 9.333333333333258, 1251 | -14 1252 | ], 1253 | [ 1254 | 9.333333333333258, 1255 | -15.33333333333394 1256 | ], 1257 | [ 1258 | 9.333333333333258, 1259 | -16 1260 | ], 1261 | [ 1262 | 9.333333333333258, 1263 | -16.66666666666788 1264 | ], 1265 | [ 1266 | 9.333333333333258, 1267 | -16.66666666666788 1268 | ] 1269 | ], 1270 | "pressures": [], 1271 | "simulatePressure": true, 1272 | "lastCommittedPoint": [ 1273 | 9.333333333333258, 1274 | -16.66666666666788 1275 | ] 1276 | }, 1277 | { 1278 | "id": "gC_SvsReGZJxnXZkjd3IB", 1279 | "type": "line", 1280 | "x": 1711.9758463211112, 1281 | "y": 10264.16112859533, 1282 | "width": 39.99999999999977, 1283 | "height": 0.6666666666678793, 1284 | "angle": 0, 1285 | "strokeColor": "#1e1e1e", 1286 | "backgroundColor": "transparent", 1287 | "fillStyle": "solid", 1288 | "strokeWidth": 4, 1289 | "strokeStyle": "solid", 1290 | "roughness": 0, 1291 | "opacity": 100, 1292 | "groupIds": [], 1293 | "frameId": null, 1294 | "roundness": null, 1295 | "seed": 941783645, 1296 | "version": 292, 1297 | "versionNonce": 199472285, 1298 | "isDeleted": false, 1299 | "boundElements": null, 1300 | "updated": 1689166583062, 1301 | "link": null, 1302 | "locked": false, 1303 | "points": [ 1304 | [ 1305 | 0, 1306 | 0 1307 | ], 1308 | [ 1309 | 39.99999999999977, 1310 | -0.6666666666678793 1311 | ] 1312 | ], 1313 | "lastCommittedPoint": null, 1314 | "startBinding": null, 1315 | "endBinding": null, 1316 | "startArrowhead": null, 1317 | "endArrowhead": null 1318 | }, 1319 | { 1320 | "type": "text", 1321 | "version": 1810, 1322 | "versionNonce": 1557475251, 1323 | "isDeleted": false, 1324 | "id": "y_-LpGgnVmVYH4sfEbAFm", 1325 | "fillStyle": "hachure", 1326 | "strokeWidth": 4, 1327 | "strokeStyle": "solid", 1328 | "roughness": 0, 1329 | "opacity": 100, 1330 | "angle": 0, 1331 | "x": 1766.862153315001, 1332 | "y": 10264.661128595328, 1333 | "strokeColor": "#e8590c", 1334 | "backgroundColor": "transparent", 1335 | "width": 54.71223449707031, 1336 | "height": 35, 1337 | "seed": 1981994547, 1338 | "groupIds": [], 1339 | "frameId": null, 1340 | "roundness": null, 1341 | "boundElements": [], 1342 | "updated": 1689166583062, 1343 | "link": null, 1344 | "locked": false, 1345 | "fontSize": 28, 1346 | "fontFamily": 1, 1347 | "text": "Q96", 1348 | "textAlign": "left", 1349 | "verticalAlign": "top", 1350 | "containerId": null, 1351 | "originalText": "Q96", 1352 | "lineHeight": 1.25, 1353 | "baseline": 25 1354 | }, 1355 | { 1356 | "id": "fGiBaBpdeeB057ixXF56z", 1357 | "type": "text", 1358 | "x": 1424.4000887453537, 1359 | "y": 10046.58537101957, 1360 | "width": 16.744064331054688, 1361 | "height": 35, 1362 | "angle": 0, 1363 | "strokeColor": "#e03131", 1364 | "backgroundColor": "transparent", 1365 | "fillStyle": "solid", 1366 | "strokeWidth": 4, 1367 | "strokeStyle": "solid", 1368 | "roughness": 0, 1369 | "opacity": 100, 1370 | "groupIds": [], 1371 | "frameId": null, 1372 | "roundness": null, 1373 | "seed": 359632819, 1374 | "version": 96, 1375 | "versionNonce": 714932531, 1376 | "isDeleted": false, 1377 | "boundElements": null, 1378 | "updated": 1689166350654, 1379 | "link": null, 1380 | "locked": false, 1381 | "text": "X", 1382 | "fontSize": 28, 1383 | "fontFamily": 1, 1384 | "textAlign": "left", 1385 | "verticalAlign": "top", 1386 | "baseline": 25, 1387 | "containerId": null, 1388 | "originalText": "X", 1389 | "lineHeight": 1.25, 1390 | "isFrameName": false 1391 | }, 1392 | { 1393 | "id": "PQERxlobVb-tapXKRezEA", 1394 | "type": "text", 1395 | "x": 1425.3091796544447, 1396 | "y": 10096.58537101957, 1397 | "width": 14.44805908203125, 1398 | "height": 35, 1399 | "angle": 0, 1400 | "strokeColor": "#1971c2", 1401 | "backgroundColor": "transparent", 1402 | "fillStyle": "solid", 1403 | "strokeWidth": 4, 1404 | "strokeStyle": "solid", 1405 | "roughness": 0, 1406 | "opacity": 100, 1407 | "groupIds": [], 1408 | "frameId": null, 1409 | "roundness": null, 1410 | "seed": 2102173235, 1411 | "version": 143, 1412 | "versionNonce": 445980541, 1413 | "isDeleted": false, 1414 | "boundElements": null, 1415 | "updated": 1689166350654, 1416 | "link": null, 1417 | "locked": false, 1418 | "text": "Y", 1419 | "fontSize": 28, 1420 | "fontFamily": 1, 1421 | "textAlign": "left", 1422 | "verticalAlign": "top", 1423 | "baseline": 25, 1424 | "containerId": null, 1425 | "originalText": "Y", 1426 | "lineHeight": 1.25, 1427 | "isFrameName": false 1428 | }, 1429 | { 1430 | "id": "TUq2sG0dFYdTW0Ycgg05Z", 1431 | "type": "text", 1432 | "x": 1456.2182705635353, 1433 | "y": 10047.494461928662, 1434 | "width": 17.276077270507812, 1435 | "height": 35, 1436 | "angle": 0, 1437 | "strokeColor": "#1e1e1e", 1438 | "backgroundColor": "transparent", 1439 | "fillStyle": "solid", 1440 | "strokeWidth": 4, 1441 | "strokeStyle": "solid", 1442 | "roughness": 0, 1443 | "opacity": 100, 1444 | "groupIds": [], 1445 | "frameId": null, 1446 | "roundness": null, 1447 | "seed": 148702131, 1448 | "version": 125, 1449 | "versionNonce": 1550607059, 1450 | "isDeleted": false, 1451 | "boundElements": null, 1452 | "updated": 1689166350654, 1453 | "link": null, 1454 | "locked": false, 1455 | "text": "=", 1456 | "fontSize": 28, 1457 | "fontFamily": 1, 1458 | "textAlign": "left", 1459 | "verticalAlign": "top", 1460 | "baseline": 25, 1461 | "containerId": null, 1462 | "originalText": "=", 1463 | "lineHeight": 1.25, 1464 | "isFrameName": false 1465 | }, 1466 | { 1467 | "id": "iAmnYgDdky8EVbiOx4yag", 1468 | "type": "text", 1469 | "x": 1492.581906927172, 1470 | "y": 10045.676280110478, 1471 | "width": 106.62446594238281, 1472 | "height": 35, 1473 | "angle": 0, 1474 | "strokeColor": "#1e1e1e", 1475 | "backgroundColor": "transparent", 1476 | "fillStyle": "solid", 1477 | "strokeWidth": 4, 1478 | "strokeStyle": "solid", 1479 | "roughness": 0, 1480 | "opacity": 100, 1481 | "groupIds": [], 1482 | "frameId": null, 1483 | "roundness": null, 1484 | "seed": 1613438099, 1485 | "version": 120, 1486 | "versionNonce": 958277597, 1487 | "isDeleted": false, 1488 | "boundElements": null, 1489 | "updated": 1689166350654, 1490 | "link": null, 1491 | "locked": false, 1492 | "text": "token 0", 1493 | "fontSize": 28, 1494 | "fontFamily": 1, 1495 | "textAlign": "left", 1496 | "verticalAlign": "top", 1497 | "baseline": 25, 1498 | "containerId": null, 1499 | "originalText": "token 0", 1500 | "lineHeight": 1.25, 1501 | "isFrameName": false 1502 | }, 1503 | { 1504 | "id": "T2_ql59b0ld9Ed-Qs26pD", 1505 | "type": "text", 1506 | "x": 1458.0364523817173, 1507 | "y": 10096.58537101957, 1508 | "width": 17.276077270507812, 1509 | "height": 35, 1510 | "angle": 0, 1511 | "strokeColor": "#1e1e1e", 1512 | "backgroundColor": "transparent", 1513 | "fillStyle": "solid", 1514 | "strokeWidth": 4, 1515 | "strokeStyle": "solid", 1516 | "roughness": 0, 1517 | "opacity": 100, 1518 | "groupIds": [], 1519 | "frameId": null, 1520 | "roundness": null, 1521 | "seed": 244813811, 1522 | "version": 180, 1523 | "versionNonce": 220106867, 1524 | "isDeleted": false, 1525 | "boundElements": null, 1526 | "updated": 1689166350654, 1527 | "link": null, 1528 | "locked": false, 1529 | "text": "=", 1530 | "fontSize": 28, 1531 | "fontFamily": 1, 1532 | "textAlign": "left", 1533 | "verticalAlign": "top", 1534 | "baseline": 25, 1535 | "containerId": null, 1536 | "originalText": "=", 1537 | "lineHeight": 1.25, 1538 | "isFrameName": false 1539 | }, 1540 | { 1541 | "id": "vop-aj8i21TgWFztSV3pI", 1542 | "type": "text", 1543 | "x": 1495.309179654445, 1544 | "y": 10094.767189201388, 1545 | "width": 94.94841003417969, 1546 | "height": 35, 1547 | "angle": 0, 1548 | "strokeColor": "#1e1e1e", 1549 | "backgroundColor": "transparent", 1550 | "fillStyle": "solid", 1551 | "strokeWidth": 4, 1552 | "strokeStyle": "solid", 1553 | "roughness": 0, 1554 | "opacity": 100, 1555 | "groupIds": [], 1556 | "frameId": null, 1557 | "roundness": null, 1558 | "seed": 894725939, 1559 | "version": 145, 1560 | "versionNonce": 1176970301, 1561 | "isDeleted": false, 1562 | "boundElements": null, 1563 | "updated": 1689166350654, 1564 | "link": null, 1565 | "locked": false, 1566 | "text": "token 1", 1567 | "fontSize": 28, 1568 | "fontFamily": 1, 1569 | "textAlign": "left", 1570 | "verticalAlign": "top", 1571 | "baseline": 25, 1572 | "containerId": null, 1573 | "originalText": "token 1", 1574 | "lineHeight": 1.25, 1575 | "isFrameName": false 1576 | }, 1577 | { 1578 | "type": "text", 1579 | "version": 629, 1580 | "versionNonce": 1853491731, 1581 | "isDeleted": false, 1582 | "id": "LgicpG8zaRoB_0dFVltzu", 1583 | "fillStyle": "hachure", 1584 | "strokeWidth": 2, 1585 | "strokeStyle": "solid", 1586 | "roughness": 0, 1587 | "opacity": 100, 1588 | "angle": 0, 1589 | "x": 1426.539992189586, 1590 | "y": 10158.176280110476, 1591 | "strokeColor": "#6741d9", 1592 | "backgroundColor": "transparent", 1593 | "width": 18.508071899414062, 1594 | "height": 35, 1595 | "seed": 1751831763, 1596 | "groupIds": [], 1597 | "frameId": null, 1598 | "roundness": null, 1599 | "boundElements": [], 1600 | "updated": 1689166350654, 1601 | "link": null, 1602 | "locked": false, 1603 | "fontSize": 28, 1604 | "fontFamily": 1, 1605 | "text": "P", 1606 | "textAlign": "left", 1607 | "verticalAlign": "top", 1608 | "containerId": null, 1609 | "originalText": "P", 1610 | "lineHeight": 1.25, 1611 | "baseline": 25 1612 | }, 1613 | { 1614 | "type": "text", 1615 | "version": 234, 1616 | "versionNonce": 1435604125, 1617 | "isDeleted": false, 1618 | "id": "jOr2N61EQ3t3q3Kh9G_9p", 1619 | "fillStyle": "solid", 1620 | "strokeWidth": 4, 1621 | "strokeStyle": "solid", 1622 | "roughness": 0, 1623 | "opacity": 100, 1624 | "angle": 0, 1625 | "x": 1458.9741713222213, 1626 | "y": 10156.358098292294, 1627 | "strokeColor": "#1e1e1e", 1628 | "backgroundColor": "transparent", 1629 | "width": 17.276077270507812, 1630 | "height": 35, 1631 | "seed": 1650985651, 1632 | "groupIds": [], 1633 | "frameId": null, 1634 | "roundness": null, 1635 | "boundElements": [], 1636 | "updated": 1689166350654, 1637 | "link": null, 1638 | "locked": false, 1639 | "fontSize": 28, 1640 | "fontFamily": 1, 1641 | "text": "=", 1642 | "textAlign": "left", 1643 | "verticalAlign": "top", 1644 | "containerId": null, 1645 | "originalText": "=", 1646 | "lineHeight": 1.25, 1647 | "baseline": 25 1648 | }, 1649 | { 1650 | "type": "text", 1651 | "version": 859, 1652 | "versionNonce": 896880563, 1653 | "isDeleted": false, 1654 | "id": "c9mM-bjCRTIpO0qDKWkK5", 1655 | "fillStyle": "hachure", 1656 | "strokeWidth": 2, 1657 | "strokeStyle": "solid", 1658 | "roughness": 0, 1659 | "opacity": 100, 1660 | "angle": 0, 1661 | "x": 1503.183194768969, 1662 | "y": 10155.873249807446, 1663 | "strokeColor": "#000000", 1664 | "backgroundColor": "transparent", 1665 | "width": 334.79742431640625, 1666 | "height": 35, 1667 | "seed": 1763886259, 1668 | "groupIds": [], 1669 | "frameId": null, 1670 | "roundness": null, 1671 | "boundElements": [], 1672 | "updated": 1689166350654, 1673 | "link": null, 1674 | "locked": false, 1675 | "fontSize": 28, 1676 | "fontFamily": 1, 1677 | "text": "Price of X in terms of Y", 1678 | "textAlign": "left", 1679 | "verticalAlign": "top", 1680 | "containerId": null, 1681 | "originalText": "Price of X in terms of Y", 1682 | "lineHeight": 1.25, 1683 | "baseline": 25 1684 | }, 1685 | { 1686 | "type": "text", 1687 | "version": 182, 1688 | "versionNonce": 51312893, 1689 | "isDeleted": false, 1690 | "id": "x_Ioux1Ag7QKWV8bd8UBU", 1691 | "fillStyle": "solid", 1692 | "strokeWidth": 4, 1693 | "strokeStyle": "solid", 1694 | "roughness": 0, 1695 | "opacity": 100, 1696 | "angle": 0, 1697 | "x": 1626.7553293070994, 1698 | "y": 10155.87324980745, 1699 | "strokeColor": "#e03131", 1700 | "backgroundColor": "transparent", 1701 | "width": 16.744064331054688, 1702 | "height": 35, 1703 | "seed": 874539571, 1704 | "groupIds": [], 1705 | "frameId": null, 1706 | "roundness": null, 1707 | "boundElements": [], 1708 | "updated": 1689166350654, 1709 | "link": null, 1710 | "locked": false, 1711 | "fontSize": 28, 1712 | "fontFamily": 1, 1713 | "text": "X", 1714 | "textAlign": "left", 1715 | "verticalAlign": "top", 1716 | "containerId": null, 1717 | "originalText": "X", 1718 | "lineHeight": 1.25, 1719 | "baseline": 25 1720 | }, 1721 | { 1722 | "type": "text", 1723 | "version": 232, 1724 | "versionNonce": 876011859, 1725 | "isDeleted": false, 1726 | "id": "BZxeh0znb0SlzD6ckX0xm", 1727 | "fillStyle": "solid", 1728 | "strokeWidth": 4, 1729 | "strokeStyle": "solid", 1730 | "roughness": 0, 1731 | "opacity": 100, 1732 | "angle": 0, 1733 | "x": 1823.933634961914, 1734 | "y": 10155.87324980745, 1735 | "strokeColor": "#1971c2", 1736 | "backgroundColor": "transparent", 1737 | "width": 14.44805908203125, 1738 | "height": 35, 1739 | "seed": 341338259, 1740 | "groupIds": [], 1741 | "frameId": null, 1742 | "roundness": null, 1743 | "boundElements": [], 1744 | "updated": 1689166350654, 1745 | "link": null, 1746 | "locked": false, 1747 | "fontSize": 28, 1748 | "fontFamily": 1, 1749 | "text": "Y", 1750 | "textAlign": "left", 1751 | "verticalAlign": "top", 1752 | "containerId": null, 1753 | "originalText": "Y", 1754 | "lineHeight": 1.25, 1755 | "baseline": 25 1756 | }, 1757 | { 1758 | "type": "text", 1759 | "version": 598, 1760 | "versionNonce": 2015416669, 1761 | "isDeleted": false, 1762 | "id": "7pQs416nsBf9_VUrpO9Vp", 1763 | "fillStyle": "hachure", 1764 | "strokeWidth": 2, 1765 | "strokeStyle": "solid", 1766 | "roughness": 0, 1767 | "opacity": 100, 1768 | "angle": 0, 1769 | "x": 1864.7317470797964, 1770 | "y": 10156.055067989268, 1771 | "strokeColor": "#000000", 1772 | "backgroundColor": "transparent", 1773 | "width": 17.276077270507812, 1774 | "height": 35, 1775 | "seed": 1558009811, 1776 | "groupIds": [], 1777 | "frameId": null, 1778 | "roundness": null, 1779 | "boundElements": [], 1780 | "updated": 1689166350654, 1781 | "link": null, 1782 | "locked": false, 1783 | "fontSize": 28, 1784 | "fontFamily": 1, 1785 | "text": "=", 1786 | "textAlign": "left", 1787 | "verticalAlign": "top", 1788 | "containerId": null, 1789 | "originalText": "=", 1790 | "lineHeight": 1.25, 1791 | "baseline": 25 1792 | }, 1793 | { 1794 | "type": "text", 1795 | "version": 469, 1796 | "versionNonce": 873807603, 1797 | "isDeleted": false, 1798 | "id": "7FgqxsMFasNkjMiDDDi7N", 1799 | "fillStyle": "hachure", 1800 | "strokeWidth": 2, 1801 | "strokeStyle": "solid", 1802 | "roughness": 0, 1803 | "opacity": 100, 1804 | "angle": 0, 1805 | "x": 1921.7031190483842, 1806 | "y": 10138.721734655934, 1807 | "strokeColor": "#1971c2", 1808 | "backgroundColor": "transparent", 1809 | "width": 14.44805908203125, 1810 | "height": 35, 1811 | "seed": 1216819219, 1812 | "groupIds": [], 1813 | "frameId": null, 1814 | "roundness": null, 1815 | "boundElements": [], 1816 | "updated": 1689166350654, 1817 | "link": null, 1818 | "locked": false, 1819 | "fontSize": 28, 1820 | "fontFamily": 1, 1821 | "text": "Y", 1822 | "textAlign": "left", 1823 | "verticalAlign": "top", 1824 | "containerId": null, 1825 | "originalText": "Y", 1826 | "lineHeight": 1.25, 1827 | "baseline": 25 1828 | }, 1829 | { 1830 | "type": "line", 1831 | "version": 505, 1832 | "versionNonce": 840474045, 1833 | "isDeleted": false, 1834 | "id": "mfrxWeqvciV6E1P0_4DXl", 1835 | "fillStyle": "hachure", 1836 | "strokeWidth": 2, 1837 | "strokeStyle": "solid", 1838 | "roughness": 0, 1839 | "opacity": 100, 1840 | "angle": 0, 1841 | "x": 1904.3697857150503, 1842 | "y": 10172.55506798927, 1843 | "strokeColor": "#000000", 1844 | "backgroundColor": "transparent", 1845 | "width": 47.33333333333326, 1846 | "height": 0, 1847 | "seed": 1592636851, 1848 | "groupIds": [], 1849 | "frameId": null, 1850 | "roundness": null, 1851 | "boundElements": [], 1852 | "updated": 1689166350654, 1853 | "link": null, 1854 | "locked": false, 1855 | "startBinding": null, 1856 | "endBinding": null, 1857 | "lastCommittedPoint": null, 1858 | "startArrowhead": null, 1859 | "endArrowhead": null, 1860 | "points": [ 1861 | [ 1862 | 0, 1863 | 0 1864 | ], 1865 | [ 1866 | 47.33333333333326, 1867 | 0 1868 | ] 1869 | ] 1870 | }, 1871 | { 1872 | "type": "text", 1873 | "version": 472, 1874 | "versionNonce": 261548179, 1875 | "isDeleted": false, 1876 | "id": "oD8LudIjcCkm_Fp8jGHm2", 1877 | "fillStyle": "hachure", 1878 | "strokeWidth": 2, 1879 | "strokeStyle": "solid", 1880 | "roughness": 0, 1881 | "opacity": 100, 1882 | "angle": 0, 1883 | "x": 1918.3697857150503, 1884 | "y": 10174.721734655934, 1885 | "strokeColor": "#e03131", 1886 | "backgroundColor": "transparent", 1887 | "width": 16.744064331054688, 1888 | "height": 35, 1889 | "seed": 498239315, 1890 | "groupIds": [], 1891 | "frameId": null, 1892 | "roundness": null, 1893 | "boundElements": [], 1894 | "updated": 1689166350654, 1895 | "link": null, 1896 | "locked": false, 1897 | "fontSize": 28, 1898 | "fontFamily": 1, 1899 | "text": "X", 1900 | "textAlign": "left", 1901 | "verticalAlign": "top", 1902 | "containerId": null, 1903 | "originalText": "X", 1904 | "lineHeight": 1.25, 1905 | "baseline": 25 1906 | }, 1907 | { 1908 | "id": "xtnYRBkb3pkD-pF_tSLgw", 1909 | "type": "rectangle", 1910 | "x": 1425.369785715051, 1911 | "y": 10239.812643746844, 1912 | "width": 449, 1913 | "height": 237, 1914 | "angle": 0, 1915 | "strokeColor": "#2f9e44", 1916 | "backgroundColor": "transparent", 1917 | "fillStyle": "solid", 1918 | "strokeWidth": 2, 1919 | "strokeStyle": "solid", 1920 | "roughness": 0, 1921 | "opacity": 100, 1922 | "groupIds": [], 1923 | "frameId": null, 1924 | "roundness": null, 1925 | "seed": 2129486909, 1926 | "version": 171, 1927 | "versionNonce": 1780291837, 1928 | "isDeleted": false, 1929 | "boundElements": null, 1930 | "updated": 1689166583062, 1931 | "link": null, 1932 | "locked": false 1933 | } 1934 | ], 1935 | "appState": { 1936 | "gridSize": null, 1937 | "viewBackgroundColor": "#ffffff" 1938 | }, 1939 | "files": {} 1940 | } -------------------------------------------------------------------------------- /excalidraw/uni-v3/clamm/clamm-1-sqrt-price-x-96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/clamm/clamm-1-sqrt-price-x-96.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/clamm/clamm-2-sqrt-price-to-tick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/clamm/clamm-2-sqrt-price-to-tick.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/clamm/clamm-3-liquidity-price-reserves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/clamm/clamm-3-liquidity-price-reserves.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/clamm/clamm-4-liquidity-net.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/clamm/clamm-4-liquidity-net.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uni-v3-liquidity-delta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uni-v3-liquidity-delta.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uni-v3-liquidity-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uni-v3-liquidity-example.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uni-v3-real-reserves-curve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uni-v3-real-reserves-curve.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uni-v3-single-pos-liq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uni-v3-single-pos-liq.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uni-v3-twap-geometric-mean.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uni-v3-twap-geometric-mean.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-capital-efficiency.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-capital-efficiency.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-fee-1-calc-fee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-fee-1-calc-fee.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-fee-2-fee-growth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-fee-2-fee-growth.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-fee-3-fee-growth-inside.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-fee-3-fee-growth-inside.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-fee-4-fee-growth-below-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-fee-4-fee-growth-below-1.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-fee-5-fee-growth-below-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-fee-5-fee-growth-below-2.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-fee-6-fee-growth-above.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-fee-6-fee-growth-above.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-fee-7-initialize.excalidraw: -------------------------------------------------------------------------------- 1 | { 2 | "type": "excalidraw", 3 | "version": 2, 4 | "source": "https://excalidraw.com", 5 | "elements": [ 6 | { 7 | "id": "fgcBi-uFmGnJ62ZvL7wOz", 8 | "type": "rectangle", 9 | "x": 1964.111129324318, 10 | "y": 13597.806326541677, 11 | "width": 13, 12 | "height": 916, 13 | "angle": 0, 14 | "strokeColor": "#5c940d", 15 | "backgroundColor": "transparent", 16 | "fillStyle": "solid", 17 | "strokeWidth": 1, 18 | "strokeStyle": "solid", 19 | "roughness": 0, 20 | "opacity": 100, 21 | "groupIds": [], 22 | "roundness": null, 23 | "seed": 693533976, 24 | "version": 106, 25 | "versionNonce": 1495022360, 26 | "isDeleted": false, 27 | "boundElements": null, 28 | "updated": 1673675764141, 29 | "link": null, 30 | "locked": false 31 | }, 32 | { 33 | "id": "RUH7Gn52tMZntLcQL7cGF", 34 | "type": "rectangle", 35 | "x": 1955.4444626576515, 36 | "y": 13655.13965987501, 37 | "width": 1530, 38 | "height": 18, 39 | "angle": 0, 40 | "strokeColor": "#5f3dc4", 41 | "backgroundColor": "transparent", 42 | "fillStyle": "solid", 43 | "strokeWidth": 1, 44 | "strokeStyle": "solid", 45 | "roughness": 0, 46 | "opacity": 100, 47 | "groupIds": [], 48 | "roundness": null, 49 | "seed": 1417287016, 50 | "version": 90, 51 | "versionNonce": 1099134744, 52 | "isDeleted": false, 53 | "boundElements": null, 54 | "updated": 1673678130011, 55 | "link": null, 56 | "locked": false 57 | }, 58 | { 59 | "id": "Tpn4id_UD5F4tOUeCYUob", 60 | "type": "text", 61 | "x": 1984.4444626576515, 62 | "y": 13611.806326541677, 63 | "width": 893, 64 | "height": 45, 65 | "angle": 0, 66 | "strokeColor": "#000000", 67 | "backgroundColor": "transparent", 68 | "fillStyle": "solid", 69 | "strokeWidth": 1, 70 | "strokeStyle": "solid", 71 | "roughness": 0, 72 | "opacity": 100, 73 | "groupIds": [], 74 | "roundness": null, 75 | "seed": 2085136664, 76 | "version": 111, 77 | "versionNonce": 1670591848, 78 | "isDeleted": false, 79 | "boundElements": null, 80 | "updated": 1673676474331, 81 | "link": null, 82 | "locked": false, 83 | "text": "Uniswap V3 Fee - Why Initialize Fee Growth Below", 84 | "fontSize": 36, 85 | "fontFamily": 1, 86 | "textAlign": "left", 87 | "verticalAlign": "top", 88 | "baseline": 32, 89 | "containerId": null, 90 | "originalText": "Uniswap V3 Fee - Why Initialize Fee Growth Below" 91 | }, 92 | { 93 | "id": "7Oup9cgkNCUNsF-m8Io1P", 94 | "type": "line", 95 | "x": 1975.2021598425326, 96 | "y": 13654.07482369083, 97 | "width": 898, 98 | "height": 0.6666666666660603, 99 | "angle": 0, 100 | "strokeColor": "#000000", 101 | "backgroundColor": "transparent", 102 | "fillStyle": "solid", 103 | "strokeWidth": 2, 104 | "strokeStyle": "solid", 105 | "roughness": 0, 106 | "opacity": 100, 107 | "groupIds": [], 108 | "roundness": null, 109 | "seed": 980628760, 110 | "version": 125, 111 | "versionNonce": 59802216, 112 | "isDeleted": false, 113 | "boundElements": null, 114 | "updated": 1673676486385, 115 | "link": null, 116 | "locked": false, 117 | "points": [ 118 | [ 119 | 0, 120 | 0 121 | ], 122 | [ 123 | 898, 124 | -0.6666666666660603 125 | ] 126 | ], 127 | "lastCommittedPoint": null, 128 | "startBinding": null, 129 | "endBinding": null, 130 | "startArrowhead": null, 131 | "endArrowhead": null 132 | } 133 | ], 134 | "appState": { 135 | "gridSize": null, 136 | "viewBackgroundColor": "#ffffff" 137 | }, 138 | "files": {} 139 | } -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-jit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-jit.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-liquidity-price-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-liquidity-price-example.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-liquidity-price.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-liquidity-price.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-sqrt-price.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-sqrt-price.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-swap-price-delta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-swap-price-delta.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-tick-and-sqrt-price-x-96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-tick-and-sqrt-price-x-96.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-twap-inverse-price.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-twap-inverse-price.png -------------------------------------------------------------------------------- /excalidraw/uni-v3/uniswap-v3-twap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uni-v3/uniswap-v3-twap.png -------------------------------------------------------------------------------- /excalidraw/uniswap-v2-twap.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/uniswap-v2-twap.jpeg -------------------------------------------------------------------------------- /excalidraw/vault.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stakewithus/notes/244162a04fc56a5a85470476ab545e4727bd9348/excalidraw/vault.png -------------------------------------------------------------------------------- /node/prefix-tree.js: -------------------------------------------------------------------------------- 1 | const words = [ 2 | "apple", 3 | "banana", 4 | "bat", 5 | "cat", 6 | "dog", 7 | "donut", 8 | "gas", 9 | "gasless", 10 | ] 11 | 12 | function insert(tree, word) { 13 | let t = tree 14 | for (let i = 0; i < word.length; i++) { 15 | const w = word[i] 16 | 17 | if (!t[w]) { 18 | t[w] = {} 19 | } 20 | if (i == word.length - 1) { 21 | t[w] = { "": {} } 22 | } 23 | t = t[w] 24 | } 25 | } 26 | 27 | function collect(tree) { 28 | if (!tree) { 29 | return [] 30 | } 31 | 32 | const q = [] 33 | const paths = [] 34 | 35 | let path = "" 36 | let up = false 37 | q.push(["", 0, tree]) 38 | 39 | while (q.length > 0) { 40 | const [k, level, node] = q.pop() 41 | 42 | if (up) { 43 | path = path.slice(0, level - 1) 44 | up = false 45 | } 46 | 47 | path += k 48 | // console.log(level, k, node, path) 49 | 50 | const keys = Object.keys(node) 51 | 52 | if (keys.length > 0) { 53 | for (let i = 0; i < keys.length; i++) { 54 | const k = keys[i] 55 | q.push([k, level + 1, node[k]]) 56 | } 57 | } else { 58 | paths.push(path) 59 | up = true 60 | } 61 | } 62 | 63 | return paths 64 | } 65 | 66 | function search(tree, word) { 67 | let t = tree 68 | 69 | for (let i = 0; i < word.length; i++) { 70 | if (!t) { 71 | return [] 72 | } 73 | t = t[word[i]] 74 | } 75 | 76 | const res = collect(t) 77 | 78 | if (res.length == 0) { 79 | return [] 80 | } 81 | 82 | return res.sort().map((suffix) => word + suffix) 83 | } 84 | 85 | async function main() { 86 | const tree = {} 87 | 88 | for (const word of words) { 89 | insert(tree, word) 90 | } 91 | 92 | console.log(JSON.stringify(tree, null, 4)) 93 | 94 | console.log(res) 95 | } 96 | 97 | main() 98 | -------------------------------------------------------------------------------- /notebook/ema.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 53, 6 | "id": "7f16914e-1411-407a-8fc4-b89ab0f749b8", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "data": { 11 | "image/png": "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\n", 12 | "text/plain": [ 13 | "
" 14 | ] 15 | }, 16 | "metadata": { 17 | "needs_background": "light" 18 | }, 19 | "output_type": "display_data" 20 | } 21 | ], 22 | "source": [ 23 | "import numpy as np\n", 24 | "import matplotlib.pyplot as plt\n", 25 | "\n", 26 | "### EMA - regular interval ###\n", 27 | "def ema(p, u):\n", 28 | " a = 0.1\n", 29 | " return a*p + (1 - a)*u\n", 30 | "\n", 31 | "### Plot ###\n", 32 | "N = 100\n", 33 | "\n", 34 | "# initial price\n", 35 | "p0 = 10\n", 36 | "\n", 37 | "# volatility\n", 38 | "v = 2\n", 39 | "delta_prices = np.random.normal(0, v, N)\n", 40 | "\n", 41 | "# prices\n", 42 | "p = p0\n", 43 | "prices = []\n", 44 | "for dp in delta_prices:\n", 45 | " prices.append(p)\n", 46 | " p += dp\n", 47 | "\n", 48 | "# moving averages\n", 49 | "avgs = []\n", 50 | "u = p0\n", 51 | "for i in range(N):\n", 52 | " avgs.append(u)\n", 53 | " p = prices[i]\n", 54 | " u = ema(p, u)\n", 55 | "\n", 56 | "plt.plot(prices)\n", 57 | "plt.plot(avgs)\n", 58 | "plt.show()" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": 4, 64 | "id": "4a34ffdd-66bd-4607-a32e-dbae87463585", 65 | "metadata": {}, 66 | "outputs": [ 67 | { 68 | "data": { 69 | "image/png": "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\n", 70 | "text/plain": [ 71 | "
" 72 | ] 73 | }, 74 | "metadata": { 75 | "needs_background": "light" 76 | }, 77 | "output_type": "display_data" 78 | } 79 | ], 80 | "source": [ 81 | "import math\n", 82 | "import numpy as np\n", 83 | "import matplotlib.pyplot as plt\n", 84 | "\n", 85 | "### EMA - irregular interval ###\n", 86 | "# half life\n", 87 | "H = 4\n", 88 | "\n", 89 | "# 1 - a_dt = 0.5**(dt/H) = e**(ln(0.5)/H * dt)\n", 90 | "# 0.5**(dt/H) = (1 - a)**dt, a = 1 - e**(ln(0.5)/H)\n", 91 | "\n", 92 | "# Find a with half life H\n", 93 | "# 0.5**(dt/H) = (1 - a)**dt\n", 94 | "# dt/H * ln(0.5) = dt * ln(1 - a)\n", 95 | "# ln(0.5) / H = ln(1 - a)\n", 96 | "# e**(ln(0.5) / H) = 1 - a\n", 97 | "# a = 1 - e**(ln(0.5)/H)\n", 98 | "\n", 99 | "def ema(p, u, dt):\n", 100 | " a_dt = 1 - math.exp(math.log(0.5) / H * dt)\n", 101 | " return a_dt*p + (1 - a_dt)*u\n", 102 | "\n", 103 | "### Plot ###\n", 104 | "N = 100\n", 105 | "\n", 106 | "# initial price\n", 107 | "p0 = 10\n", 108 | "\n", 109 | "# volatility\n", 110 | "v = 2\n", 111 | "delta_prices = np.random.normal(0, v, N)\n", 112 | "# delta_prices = [-1 for i in range(N)]\n", 113 | "\n", 114 | "# prices\n", 115 | "p = p0\n", 116 | "prices = []\n", 117 | "for dp in delta_prices:\n", 118 | " prices.append(p)\n", 119 | " p += dp\n", 120 | "\n", 121 | "# moving averages\n", 122 | "# avgs[0] = regular interval\n", 123 | "# avgs[1] = irregular interval\n", 124 | "avgs = [[], []]\n", 125 | "\n", 126 | "# regular interval\n", 127 | "u = p0 \n", 128 | "for t in range(N):\n", 129 | " avgs[0].append(u)\n", 130 | " p = prices[t]\n", 131 | " u = ema(p, u, 1)\n", 132 | "\n", 133 | "# irregular interval\n", 134 | "t = 0\n", 135 | "ts = []\n", 136 | "u = p0\n", 137 | "while t < N:\n", 138 | " ts.append(t)\n", 139 | " avgs[1].append(u)\n", 140 | "\n", 141 | " dt = np.random.randint(1, 2*H)\n", 142 | " t += dt\n", 143 | " \n", 144 | " if t < N:\n", 145 | " p = prices[t]\n", 146 | " u = ema(p, u, dt)\n", 147 | "\n", 148 | "plt.plot(prices)\n", 149 | "plt.plot(avgs[0])\n", 150 | "plt.plot(ts, avgs[1], marker=\"o\")\n", 151 | "plt.grid()\n", 152 | "plt.show()" 153 | ] 154 | } 155 | ], 156 | "metadata": { 157 | "kernelspec": { 158 | "display_name": "Python 3 (ipykernel)", 159 | "language": "python", 160 | "name": "python3" 161 | }, 162 | "language_info": { 163 | "codemirror_mode": { 164 | "name": "ipython", 165 | "version": 3 166 | }, 167 | "file_extension": ".py", 168 | "mimetype": "text/x-python", 169 | "name": "python", 170 | "nbconvert_exporter": "python", 171 | "pygments_lexer": "ipython3", 172 | "version": "3.10.11" 173 | } 174 | }, 175 | "nbformat": 4, 176 | "nbformat_minor": 5 177 | } 178 | -------------------------------------------------------------------------------- /notebook/fft.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 28, 6 | "id": "f8559a49-563f-4b97-b98e-07dac269dd20", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "def eval_poly(p, x0):\n", 11 | " \"\"\"\n", 12 | " Evaluate polynomial at x0\n", 13 | " \"\"\"\n", 14 | " y = 0\n", 15 | " x = 1\n", 16 | " for c in p:\n", 17 | " y += c * x\n", 18 | " x *= x0\n", 19 | " return y" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 30, 25 | "id": "d52197a9-1bdc-408d-be90-fe1381104d73", 26 | "metadata": {}, 27 | "outputs": [], 28 | "source": [ 29 | "import cmath\n", 30 | "import numpy as np\n", 31 | "\n", 32 | "def fft(p, x):\n", 33 | " n = len(p)\n", 34 | " if n == 1:\n", 35 | " return p\n", 36 | " \n", 37 | " evens = p[::2]\n", 38 | " odds = p[1::2]\n", 39 | " pe = fft(evens, x[::2])\n", 40 | " po = fft(odds, x[::2])\n", 41 | " y = [0 for i in x]\n", 42 | " \n", 43 | " l = n // 2\n", 44 | " for i in range(l):\n", 45 | " v = x[i] * po[i]\n", 46 | " y[i] = pe[i] + v\n", 47 | " y[i + l] = pe[i] - v\n", 48 | " \n", 49 | " return y" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": 36, 55 | "id": "263c65fc-a586-4b8d-bf0c-bc5041057ba6", 56 | "metadata": {}, 57 | "outputs": [ 58 | { 59 | "name": "stdout", 60 | "output_type": "stream", 61 | "text": [ 62 | "eval: [(11+0j), (3+2.0000000000000004j), (3+2.449293598294706e-16j), (2.9999999999999996-1.9999999999999991j)]\n", 63 | "fft: [(11+0j), (3+2j), (3+0j), (3-2j)]\n", 64 | "np fft: [11.+0.j 3.-2.j 3.+0.j 3.+2.j]\n" 65 | ] 66 | } 67 | ], 68 | "source": [ 69 | "import cmath\n", 70 | "import numpy as np\n", 71 | "\n", 72 | "def roots(n):\n", 73 | " \"\"\"\n", 74 | " roots of unity, counter-clockwise order starting from 1\n", 75 | " \"\"\"\n", 76 | " return [cmath.exp((2 * cmath.pi * 1j * k) / n) for k in range(0, n)]\n", 77 | "\n", 78 | "p = [5, 3, 2, 1]\n", 79 | "x = roots(4)\n", 80 | "y = fft(p, x)\n", 81 | "\n", 82 | "print(\"eval: \", [eval_poly(p, xi) for xi in x])\n", 83 | "print(\"fft: \", y)\n", 84 | "print(\"np fft:\", np.fft.fft(p))" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 40, 90 | "id": "0fa1ea94-e298-4cf8-ba89-e07502f45232", 91 | "metadata": {}, 92 | "outputs": [ 93 | { 94 | "name": "stdout", 95 | "output_type": "stream", 96 | "text": [ 97 | "[31, 70, 109, 74, 334, 181, 232, 4]\n", 98 | "[31, 70, 109, 74, 334, 181, 232, 4]\n" 99 | ] 100 | } 101 | ], 102 | "source": [ 103 | "def fft_mod(p, x, mod):\n", 104 | " n = len(p)\n", 105 | " if n == 1:\n", 106 | " return p\n", 107 | " \n", 108 | " evens = p[::2]\n", 109 | " odds = p[1::2]\n", 110 | " pe = fft_mod(evens, x[::2], mod)\n", 111 | " po = fft_mod(odds, x[::2], mod)\n", 112 | " y = [0 for i in x]\n", 113 | " \n", 114 | " l = n // 2\n", 115 | " for i in range(l):\n", 116 | " v = x[i] * po[i]\n", 117 | " y[i] = (pe[i] + v) % mod\n", 118 | " y[i + l] = (pe[i] - v) % mod\n", 119 | " \n", 120 | " return y\n", 121 | "\n", 122 | "p = [3, 1, 4, 1, 5, 9, 2, 6]\n", 123 | "x = [1, 85, 148, 111, 336, 252, 189, 226]\n", 124 | "\n", 125 | "print(fft_mod(p, x, 337))\n", 126 | "print([eval_poly(p, xi) % 337 for xi in x])" 127 | ] 128 | } 129 | ], 130 | "metadata": { 131 | "kernelspec": { 132 | "display_name": "Python 3 (ipykernel)", 133 | "language": "python", 134 | "name": "python3" 135 | }, 136 | "language_info": { 137 | "codemirror_mode": { 138 | "name": "ipython", 139 | "version": 3 140 | }, 141 | "file_extension": ".py", 142 | "mimetype": "text/x-python", 143 | "name": "python", 144 | "nbconvert_exporter": "python", 145 | "pygments_lexer": "ipython3", 146 | "version": "3.10.11" 147 | } 148 | }, 149 | "nbformat": 4, 150 | "nbformat_minor": 5 151 | } 152 | -------------------------------------------------------------------------------- /notebook/log2.py.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "2fdc9ff5", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "name": "stdout", 11 | "output_type": "stream", 12 | "text": [ 13 | "[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n" 14 | ] 15 | }, 16 | { 17 | "data": { 18 | "text/plain": [ 19 | "0.12345" 20 | ] 21 | }, 22 | "execution_count": 1, 23 | "metadata": {}, 24 | "output_type": "execute_result" 25 | } 26 | ], 27 | "source": [ 28 | "def dec_to_bin(y):\n", 29 | " # y = y_0 + 1/2 * y_1 + 1/4 * y_2 + 1/8 * y_3 + ...\n", 30 | " # = y_0 + 1/2 * (y_1 + 1/2 * (y_2 + 1/2 * (y_3 + ...)))\n", 31 | "\n", 32 | " # 0 <= y < 1 so y_0 = 0\n", 33 | " assert 0 <= y < 1\n", 34 | "\n", 35 | " # N + 1 bits\n", 36 | " N = 100\n", 37 | " ys = [0]\n", 38 | "\n", 39 | " for i in range(1, N + 1):\n", 40 | " y = 2 * y\n", 41 | " # 2y >= 1 implies y_i = 1\n", 42 | " # 2y < 1 implies y_i = 0\n", 43 | " if y >= 1:\n", 44 | " ys.append(1)\n", 45 | " y -= 1\n", 46 | " else:\n", 47 | " ys.append(0)\n", 48 | " return ys\n", 49 | "\n", 50 | "def bin_to_dec(ys):\n", 51 | " y = 0\n", 52 | " for i in range(len(ys)):\n", 53 | " y += ys[i] * (2 ** -i)\n", 54 | " return y\n", 55 | "\n", 56 | "y = 0.12345\n", 57 | "\n", 58 | "ys = dec_to_bin(y)\n", 59 | "print(ys)\n", 60 | "\n", 61 | "bin_to_dec(ys)" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": 2, 67 | "id": "c628cdc4", 68 | "metadata": {}, 69 | "outputs": [ 70 | { 71 | "data": { 72 | "text/plain": [ 73 | "(0.30392683648069474, 0.30392683648069474)" 74 | ] 75 | }, 76 | "execution_count": 2, 77 | "metadata": {}, 78 | "output_type": "execute_result" 79 | } 80 | ], 81 | "source": [ 82 | "import math\n", 83 | "\n", 84 | "def log2(x):\n", 85 | " assert 1 <= x < 2\n", 86 | "\n", 87 | " if x == 1:\n", 88 | " return 0\n", 89 | "\n", 90 | " y = 0\n", 91 | "\n", 92 | " base = 1\n", 93 | " for i in range(1, 100):\n", 94 | " base = base / 2\n", 95 | "\n", 96 | " # log2(x) = y\n", 97 | " # x = 2^y\n", 98 | " # x^2 = 2^(2y)\n", 99 | "\n", 100 | " # if x^2 = 2^(2y) >= 2 then 2y >= 1\n", 101 | " # 2y >= 1 implies y_i = 1\n", 102 | " # 2y < 1 implies y_i = 0\n", 103 | " x = x * x\n", 104 | " if x >= 2:\n", 105 | " y += base\n", 106 | " x = x / 2\n", 107 | "\n", 108 | " return y\n", 109 | "\n", 110 | "math.log2(1.2345), log2(1.2345)" 111 | ] 112 | } 113 | ], 114 | "metadata": { 115 | "kernelspec": { 116 | "display_name": "Python 3 (ipykernel)", 117 | "language": "python", 118 | "name": "python3" 119 | }, 120 | "language_info": { 121 | "codemirror_mode": { 122 | "name": "ipython", 123 | "version": 3 124 | }, 125 | "file_extension": ".py", 126 | "mimetype": "text/x-python", 127 | "name": "python", 128 | "nbconvert_exporter": "python", 129 | "pygments_lexer": "ipython3", 130 | "version": "3.10.8" 131 | } 132 | }, 133 | "nbformat": 4, 134 | "nbformat_minor": 5 135 | } 136 | -------------------------------------------------------------------------------- /notebook/quadratic_funding.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 21, 6 | "id": "ade4a320-bf47-4384-8e5a-4f15305c9136", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "name": "stdout", 11 | "output_type": "stream", 12 | "text": [ 13 | "qf scores: [5000.0, 2000.0000000000002, 20000.0]\n", 14 | "matched amounts: [1851.8518518518517, 740.7407407407409, 7407.407407407407]\n", 15 | "% matched: [1.8518518518518516, 0.7407407407407409, 7.4074074074074066]\n" 16 | ] 17 | } 18 | ], 19 | "source": [ 20 | "import math\n", 21 | "\n", 22 | "project_contributions = [\n", 23 | " [200 for _ in range(5)],\n", 24 | " [500, 500],\n", 25 | " [50 for _ in range(20)]\n", 26 | "]\n", 27 | "\n", 28 | "def calc_qf_score(contributions):\n", 29 | " x = sum(map(math.sqrt, contributions))\n", 30 | " return x * x\n", 31 | "\n", 32 | "qf_scores = []\n", 33 | "for contributions in project_contributions:\n", 34 | " qf_scores.append(calc_qf_score(contributions))\n", 35 | "\n", 36 | "qf_total = sum(qf_scores)\n", 37 | "\n", 38 | "pool = 10000\n", 39 | "\n", 40 | "matched_amounts = []\n", 41 | "for i in range(len(project_contributions)):\n", 42 | " matched_amounts.append(qf_scores[i] / qf_total * pool)\n", 43 | "\n", 44 | "matched_rates = []\n", 45 | "for i in range(len(project_contributions)):\n", 46 | " matched_rates.append(matched_amounts[i] / sum(project_contributions[i]))\n", 47 | "\n", 48 | "print(\"qf scores:\", qf_scores)\n", 49 | "print(\"matched amounts:\", matched_amounts)\n", 50 | "print(\"% matched:\", matched_rates) " 51 | ] 52 | } 53 | ], 54 | "metadata": { 55 | "kernelspec": { 56 | "display_name": "Python 3 (ipykernel)", 57 | "language": "python", 58 | "name": "python3" 59 | }, 60 | "language_info": { 61 | "codemirror_mode": { 62 | "name": "ipython", 63 | "version": 3 64 | }, 65 | "file_extension": ".py", 66 | "mimetype": "text/x-python", 67 | "name": "python", 68 | "nbconvert_exporter": "python", 69 | "pygments_lexer": "ipython3", 70 | "version": "3.10.11" 71 | } 72 | }, 73 | "nbformat": 4, 74 | "nbformat_minor": 5 75 | } 76 | -------------------------------------------------------------------------------- /notebook/rpow.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 8, 6 | "id": "21fa60fc-9319-4a6f-b02f-0053e5afd2e0", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "name": "stdout", 11 | "output_type": "stream", 12 | "text": [ 13 | "1 3 3\n", 14 | "2 9 9\n", 15 | "4 81 81\n", 16 | "8 6561 6561\n", 17 | "16 43046721 43046721\n" 18 | ] 19 | } 20 | ], 21 | "source": [ 22 | "def pow_2n(x, n):\n", 23 | " if n == 0:\n", 24 | " return 1\n", 25 | " while n > 0:\n", 26 | " x = x * x\n", 27 | " n //= 2\n", 28 | " return x\n", 29 | "\n", 30 | "for i in range(0, 5):\n", 31 | " print(2**i, pow(3, (2**i)), 3**(2**i))" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 1, 37 | "id": "35af4a44-fca8-4a74-b133-622c9201a81a", 38 | "metadata": {}, 39 | "outputs": [ 40 | { 41 | "name": "stdout", 42 | "output_type": "stream", 43 | "text": [ 44 | "0 1 1\n", 45 | "1 3 3\n", 46 | "2 9 9\n", 47 | "3 27 27\n", 48 | "4 81 81\n", 49 | "5 243 243\n", 50 | "6 729 729\n", 51 | "7 2187 2187\n", 52 | "8 6561 6561\n", 53 | "9 19683 19683\n", 54 | "10 59049 59049\n", 55 | "11 177147 177147\n", 56 | "12 531441 531441\n", 57 | "13 1594323 1594323\n", 58 | "14 4782969 4782969\n", 59 | "15 14348907 14348907\n", 60 | "16 43046721 43046721\n", 61 | "17 129140163 129140163\n", 62 | "18 387420489 387420489\n", 63 | "19 1162261467 1162261467\n" 64 | ] 65 | } 66 | ], 67 | "source": [ 68 | "def pow(x, n):\n", 69 | " z = 1\n", 70 | " while n > 0:\n", 71 | " if n % 2 == 1:\n", 72 | " z *= x\n", 73 | " # x*x not needed when n = 1\n", 74 | " x = x*x\n", 75 | " n //= 2\n", 76 | " return z\n", 77 | "\n", 78 | "for i in range(0, 20):\n", 79 | " print(i, pow(3, i), 3**i)" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 4, 85 | "id": "d00b1499-5b50-4fc1-979f-213d9a522c38", 86 | "metadata": {}, 87 | "outputs": [ 88 | { 89 | "name": "stdout", 90 | "output_type": "stream", 91 | "text": [ 92 | "0 1 1\n", 93 | "1 3 3\n", 94 | "2 9 9\n", 95 | "3 27 27\n", 96 | "4 81 81\n", 97 | "5 243 243\n", 98 | "6 729 729\n", 99 | "7 2187 2187\n", 100 | "8 6561 6561\n", 101 | "9 19683 19683\n", 102 | "10 59049 59049\n", 103 | "11 177147 177147\n", 104 | "12 531441 531441\n", 105 | "13 1594323 1594323\n", 106 | "14 4782969 4782969\n", 107 | "15 14348907 14348907\n", 108 | "16 43046721 43046721\n", 109 | "17 129140163 129140163\n", 110 | "18 387420489 387420489\n", 111 | "19 1162261467 1162261467\n" 112 | ] 113 | } 114 | ], 115 | "source": [ 116 | "def pow_v2(x, n):\n", 117 | " z = x if n % 2 == 1 else 1\n", 118 | " n //= 2\n", 119 | " while n > 0:\n", 120 | " x = x*x\n", 121 | " if n % 2 == 1:\n", 122 | " z *= x\n", 123 | " n //= 2\n", 124 | " return z\n", 125 | "\n", 126 | "for i in range(0, 20):\n", 127 | " print(i, pow(3, i), 3**i)" 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": 6, 133 | "id": "b090e5a2-3172-49bd-a883-9b35719b20ac", 134 | "metadata": {}, 135 | "outputs": [ 136 | { 137 | "name": "stdout", 138 | "output_type": "stream", 139 | "text": [ 140 | "0 1000 1000\n", 141 | "1 3000 3000\n", 142 | "2 9000 9000\n", 143 | "3 27000 27000\n", 144 | "4 81000 81000\n", 145 | "5 243000 243000\n", 146 | "6 729000 729000\n", 147 | "7 2187000 2187000\n", 148 | "8 6561000 6561000\n", 149 | "9 19683000 19683000\n", 150 | "10 59049000 59049000\n", 151 | "11 177147000 177147000\n", 152 | "12 531441000 531441000\n", 153 | "13 1594323000 1594323000\n", 154 | "14 4782969000 4782969000\n", 155 | "15 14348907000 14348907000\n", 156 | "16 43046721000 43046721000\n", 157 | "17 129140163000 129140163000\n", 158 | "18 387420489000 387420489000\n", 159 | "19 1162261467000 1162261467000\n" 160 | ] 161 | } 162 | ], 163 | "source": [ 164 | "# Fixed point decimals b\n", 165 | "def rpow(x, n, b):\n", 166 | " z = x if n % 2 == 1 else b\n", 167 | " n //= 2\n", 168 | " while n > 0:\n", 169 | " x = x*x\n", 170 | " x //= b\n", 171 | " if n % 2 == 1:\n", 172 | " z *= x\n", 173 | " z //= b\n", 174 | " n //= 2\n", 175 | " return z\n", 176 | "\n", 177 | "b = 1000\n", 178 | "for i in range(0, 20):\n", 179 | " print(i, rpow(3*b, i, b), 3**i*b)" 180 | ] 181 | } 182 | ], 183 | "metadata": { 184 | "kernelspec": { 185 | "display_name": "Python 3 (ipykernel)", 186 | "language": "python", 187 | "name": "python3" 188 | }, 189 | "language_info": { 190 | "codemirror_mode": { 191 | "name": "ipython", 192 | "version": 3 193 | }, 194 | "file_extension": ".py", 195 | "mimetype": "text/x-python", 196 | "name": "python", 197 | "nbconvert_exporter": "python", 198 | "pygments_lexer": "ipython3", 199 | "version": "3.10.7" 200 | } 201 | }, 202 | "nbformat": 4, 203 | "nbformat_minor": 5 204 | } 205 | -------------------------------------------------------------------------------- /notebook/uniswap-v3/sqrt_price.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "id": "211c55a0-9656-48cc-8bc0-d7c3a913ba19", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "data": { 11 | "text/plain": [ 12 | "1888.9727296834467" 13 | ] 14 | }, 15 | "execution_count": 2, 16 | "metadata": {}, 17 | "output_type": "execute_result" 18 | } 19 | ], 20 | "source": [ 21 | "sqrt_price_x_96 = 3443439269043970780644209\n", 22 | "q = 2 ** 96\n", 23 | "p = (sqrt_price_x_96 / q)**2 \n", 24 | "\n", 25 | "# token 0 = ETH\n", 26 | "decimals_0 = 1e18\n", 27 | "# token 1 = USDC\n", 28 | "decimals_1 = 1e6\n", 29 | "\n", 30 | "p * decimals_0 / decimals_1" 31 | ] 32 | } 33 | ], 34 | "metadata": { 35 | "kernelspec": { 36 | "display_name": "Python 3 (ipykernel)", 37 | "language": "python", 38 | "name": "python3" 39 | }, 40 | "language_info": { 41 | "codemirror_mode": { 42 | "name": "ipython", 43 | "version": 3 44 | }, 45 | "file_extension": ".py", 46 | "mimetype": "text/x-python", 47 | "name": "python", 48 | "nbconvert_exporter": "python", 49 | "pygments_lexer": "ipython3", 50 | "version": "3.10.11" 51 | } 52 | }, 53 | "nbformat": 4, 54 | "nbformat_minor": 5 55 | } 56 | -------------------------------------------------------------------------------- /notebook/uniswap-v3/sqrt_price_to_tick.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 6, 6 | "id": "f531723c-e81b-4358-bb2f-efdaeb92954f", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "data": { 11 | "text/plain": [ 12 | "-200920.392088956" 13 | ] 14 | }, 15 | "execution_count": 6, 16 | "metadata": {}, 17 | "output_type": "execute_result" 18 | } 19 | ], 20 | "source": [ 21 | "import math\n", 22 | "\n", 23 | "sqrt_price = 3436899527919986964832931\n", 24 | "q = 2 ** 96\n", 25 | "tick = -200921\n", 26 | "\n", 27 | "tick = 2 * math.log(sqrt_price / q) / math.log(1.0001)\n", 28 | "tick" 29 | ] 30 | } 31 | ], 32 | "metadata": { 33 | "kernelspec": { 34 | "display_name": "Python 3 (ipykernel)", 35 | "language": "python", 36 | "name": "python3" 37 | }, 38 | "language_info": { 39 | "codemirror_mode": { 40 | "name": "ipython", 41 | "version": 3 42 | }, 43 | "file_extension": ".py", 44 | "mimetype": "text/x-python", 45 | "name": "python", 46 | "nbconvert_exporter": "python", 47 | "pygments_lexer": "ipython3", 48 | "version": "3.10.11" 49 | } 50 | }, 51 | "nbformat": 4, 52 | "nbformat_minor": 5 53 | } 54 | -------------------------------------------------------------------------------- /notebook/uniswap-v3/tick-and-sqrt-price-x-96.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "5351fcdb", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "name": "stdout", 11 | "output_type": "stream", 12 | "text": [ 13 | "2198795518956857915306525730013184\n", 14 | "204632\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "import math\n", 20 | "\n", 21 | "Q96 = 2**96\n", 22 | "\n", 23 | "def tick_to_sqrt_price_x_96(tick):\n", 24 | " return int(1.0001 ** (tick / 2) * Q96)\n", 25 | "\n", 26 | "tick = 204632\n", 27 | "print(tick_to_sqrt_price_x_96(tick))\n", 28 | "\n", 29 | "def sqrt_price_x_96_to_tick(sqrt_price_x_96):\n", 30 | " base = math.sqrt(1.0001)\n", 31 | " p = sqrt_price_x_96 / Q96\n", 32 | " return math.floor(math.log(p, base))\n", 33 | "\n", 34 | "sqrt_price_x_96 = 2198835844819193856025769912483279\n", 35 | "print(sqrt_price_x_96_to_tick(sqrt_price_x_96))" 36 | ] 37 | } 38 | ], 39 | "metadata": { 40 | "kernelspec": { 41 | "display_name": "Python 3 (ipykernel)", 42 | "language": "python", 43 | "name": "python3" 44 | }, 45 | "language_info": { 46 | "codemirror_mode": { 47 | "name": "ipython", 48 | "version": 3 49 | }, 50 | "file_extension": ".py", 51 | "mimetype": "text/x-python", 52 | "name": "python", 53 | "nbconvert_exporter": "python", 54 | "pygments_lexer": "ipython3", 55 | "version": "3.10.7" 56 | } 57 | }, 58 | "nbformat": 4, 59 | "nbformat_minor": 5 60 | } 61 | -------------------------------------------------------------------------------- /notebook/uniswap-v3/tick.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 4, 6 | "id": "7143ff02-e948-4618-b414-5ae48c7bb094", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "data": { 11 | "text/plain": [ 12 | "1873.8039920059173" 13 | ] 14 | }, 15 | "execution_count": 4, 16 | "metadata": {}, 17 | "output_type": "execute_result" 18 | } 19 | ], 20 | "source": [ 21 | "tick = -200963\n", 22 | "p = 1.0001 ** tick\n", 23 | "\n", 24 | "# token 0 = ETH\n", 25 | "decimals_0 = 1e18\n", 26 | "# token 1 = USDC\n", 27 | "decimals_1 = 1e6\n", 28 | "\n", 29 | "p * decimals_0 / decimals_1" 30 | ] 31 | } 32 | ], 33 | "metadata": { 34 | "kernelspec": { 35 | "display_name": "Python 3 (ipykernel)", 36 | "language": "python", 37 | "name": "python3" 38 | }, 39 | "language_info": { 40 | "codemirror_mode": { 41 | "name": "ipython", 42 | "version": 3 43 | }, 44 | "file_extension": ".py", 45 | "mimetype": "text/x-python", 46 | "name": "python", 47 | "nbconvert_exporter": "python", 48 | "pygments_lexer": "ipython3", 49 | "version": "3.10.11" 50 | } 51 | }, 52 | "nbformat": 4, 53 | "nbformat_minor": 5 54 | } 55 | -------------------------------------------------------------------------------- /zk/zkp.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 18, 6 | "id": "ad2f3d22", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "name": "stdout", 11 | "output_type": "stream", 12 | "text": [ 13 | "problem [4, 11, 8, 1]\n", 14 | "witness [2, 6, -5, 3, 2]\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "# http://www.shirpeled.com/2018/10/a-hands-on-tutorial-for-zero-knowledge_4.html\n", 20 | "\n", 21 | "import random\n", 22 | "\n", 23 | "def get_witness(problem, assignment):\n", 24 | " \"\"\"\n", 25 | " Given an instance of a partition problem via a list of numbers (the problem) and a list of\n", 26 | " (-1, 1), we say that the assignment satisfies the problem if their dot product is 0.\n", 27 | " \"\"\"\n", 28 | " assert len(problem) == len(assignment)\n", 29 | "\n", 30 | " # partial sum\n", 31 | " s = 0\n", 32 | " side_obfuscator = 1 if random.random() > 0.5 else -1\n", 33 | " witness = [s]\n", 34 | " \n", 35 | " for num, side in zip(problem, assignment):\n", 36 | " assert side == 1 or side == -1\n", 37 | " s += side * num * side_obfuscator\n", 38 | " witness.append(s)\n", 39 | " \n", 40 | " assert s == 0\n", 41 | " shift = random.randint(0, max(0, max(problem)))\n", 42 | " witness = [x + shift for x in witness]\n", 43 | " \n", 44 | " return witness\n", 45 | "\n", 46 | "### Test\n", 47 | "problem = [4, 11, 8, 1]\n", 48 | "assignment = [1, -1, 1, -1]\n", 49 | "\n", 50 | "w = get_witness(problem, assignment)\n", 51 | "n = len(problem)\n", 52 | "\n", 53 | "print(\"problem\", problem)\n", 54 | "print(\"witness\", w)\n", 55 | "\n", 56 | "### Checks\n", 57 | "assert w[0] == w[n]\n", 58 | "\n", 59 | "for i in range(n):\n", 60 | " assert abs(w[i + 1] - w[i]) == abs(problem[i])\n" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": 19, 66 | "id": "c1456d1d", 67 | "metadata": {}, 68 | "outputs": [ 69 | { 70 | "data": { 71 | "text/plain": [ 72 | "True" 73 | ] 74 | }, 75 | "execution_count": 19, 76 | "metadata": {}, 77 | "output_type": "execute_result" 78 | } 79 | ], 80 | "source": [ 81 | "import hashlib\n", 82 | "from math import log2, ceil\n", 83 | "\n", 84 | "def hash_string(s):\n", 85 | " return hashlib.sha256(s.encode()).hexdigest()\n", 86 | "\n", 87 | "class MerkleTree:\n", 88 | " \"\"\"\n", 89 | " A naive Merkle tree implementation using SHA256\n", 90 | " \"\"\"\n", 91 | " def __init__(self, data):\n", 92 | " self.data = data\n", 93 | " next_pow_of_2 = int(2**ceil(log2(len(data))))\n", 94 | " self.data.extend([0] * (next_pow_of_2 - len(data)))\n", 95 | " self.tree = [\"\" for x in self.data] + \\\n", 96 | " [hash_string(str(x)) for x in self.data]\n", 97 | " for i in range(len(self.data) - 1, 0, -1):\n", 98 | " self.tree[i] = hash_string(self.tree[i * 2] + self.tree[i * 2 + 1])\n", 99 | "\n", 100 | " def get_root(self):\n", 101 | " return self.tree[1]\n", 102 | "\n", 103 | " def get_val_and_path(self, i):\n", 104 | " val = self.data[i]\n", 105 | " auth_path = []\n", 106 | " i = i + len(self.data)\n", 107 | " while i > 1:\n", 108 | " auth_path += [self.tree[i ^ 1]]\n", 109 | " i = i // 2\n", 110 | " return val, auth_path\n", 111 | "\n", 112 | "def verify(root, data_size, i, value, path):\n", 113 | " cur = hash_string(str(value))\n", 114 | " tree_node_id = i + int(2**ceil(log2(data_size)))\n", 115 | " for sibling in path:\n", 116 | " assert tree_node_id > 1\n", 117 | " if tree_node_id % 2 == 0:\n", 118 | " cur = hash_string(cur + sibling)\n", 119 | " else:\n", 120 | " cur = hash_string(sibling + cur)\n", 121 | " tree_node_id = tree_node_id // 2\n", 122 | " assert tree_node_id == 1\n", 123 | " return root == cur\n", 124 | "\n", 125 | "data = [\"Yes\", \"Sir\", \"I Can\", \"Boogie!\"]\n", 126 | "merkle_tree = MerkleTree(data)\n", 127 | "\n", 128 | "root = merkle_tree.get_root()\n", 129 | "(val, path) = merkle_tree.get_val_and_path(1)\n", 130 | "\n", 131 | "verify(root, len(data), 1, val, path)" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": 20, 137 | "id": "688dc711", 138 | "metadata": {}, 139 | "outputs": [ 140 | { 141 | "data": { 142 | "text/plain": [ 143 | "True" 144 | ] 145 | }, 146 | "execution_count": 20, 147 | "metadata": {}, 148 | "output_type": "execute_result" 149 | } 150 | ], 151 | "source": [ 152 | "import random\n", 153 | "\n", 154 | "class ZkMerkleTree:\n", 155 | " \"\"\"\n", 156 | " A Zero Knowledge Merkle tree implementation using SHA256\n", 157 | " \"\"\"\n", 158 | " def __init__(self, data):\n", 159 | " self.data = data\n", 160 | " next_pow_of_2 = int(2**ceil(log2(len(data))))\n", 161 | " self.data.extend([0] * (next_pow_of_2 - len(data)))\n", 162 | " # Intertwine with randomness to obtain zero knowledge.\n", 163 | " rand_list = [random.randint(0, 1 << 32) for x in self.data]\n", 164 | " self.data = [x for tup in zip(self.data, rand_list) for x in tup]\n", 165 | " # Create bottom level of the tree (i.e. leaves).\n", 166 | " self.tree = [\"\" for x in self.data] + \\\n", 167 | " [hash_string(str(x)) for x in self.data]\n", 168 | " for i in range(len(self.data) - 1, 0, -1):\n", 169 | " self.tree[i] = hash_string(self.tree[i * 2] + self.tree[i * 2 + 1])\n", 170 | "\n", 171 | " def get_root(self):\n", 172 | " return self.tree[1]\n", 173 | "\n", 174 | " def get_val_and_path(self, i):\n", 175 | " # Because of the zk padding, the data is now at id * 2\n", 176 | " i = i * 2\n", 177 | " val = self.data[i]\n", 178 | " auth_path = []\n", 179 | " i = i + len(self.data)\n", 180 | " while i > 1:\n", 181 | " auth_path += [self.tree[i ^ 1]]\n", 182 | " i = i // 2\n", 183 | " return val, auth_path\n", 184 | "\n", 185 | "def verify_zk(root, data_size, i, value, path):\n", 186 | " cur = hash_string(str(value))\n", 187 | " # Due to zk padding, data_size needs to be multiplied by 2, as does the value_id\n", 188 | " tree_node_id = i * 2 + int(2**ceil(log2(data_size * 2)))\n", 189 | " for sibling in path:\n", 190 | " assert tree_node_id > 1\n", 191 | " if tree_node_id % 2 == 0:\n", 192 | " cur = hash_string(cur + sibling)\n", 193 | " else:\n", 194 | " cur = hash_string(sibling + cur)\n", 195 | " tree_node_id = tree_node_id // 2\n", 196 | " assert tree_node_id == 1\n", 197 | " return root == cur\n", 198 | "\n", 199 | "data = [\"Yes\", \"Sir\", \"I Can\", \"Boogie!\"]\n", 200 | "zk_merkle_tree = ZkMerkleTree(data)\n", 201 | "\n", 202 | "root = zk_merkle_tree.get_root()\n", 203 | "(val, path) = zk_merkle_tree.get_val_and_path(1)\n", 204 | "\n", 205 | "verify_zk(root, len(data), 1, val, path)" 206 | ] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "execution_count": 21, 211 | "id": "a1443102", 212 | "metadata": {}, 213 | "outputs": [ 214 | { 215 | "name": "stdout", 216 | "output_type": "stream", 217 | "text": [ 218 | "[['bda6731996768a7c7b22e15f9b5c471e24f9f62280d9e00850fa0a0419916ab5', 3, -2, ['a47072bd2b6331c7a62342461ac054707b9fa7d9a9ab89a3a5f87791fa1bb462', 'bfe8106e3a1c642d67a77291460dced46d3f02715c0c7a7a3d00f3dfafd82abb', '4fadeb086017522850e824628168b54d4ca51d0dc58924fc08c82a97645cfe3d', '31cdd36cbead976c90e746f9c32230d5a432c476396774bde5f73058b45a0c16'], 4, ['6df2a639d10bc7ccb8f5ecce2b8646aa54b9d45c63feca81033c1ccd5a45f93c', 'a909e6d4ee4b74fa7e485e5a726ce67639052cb9424c86ded82ee0f9429a2b1c', 'b9a296bf77dca655aeed49eb07020b5204ab93b354b4385b38642d1a1df9e25d', '0b08e63cdfd1b758e2627c229e148b641982fba468832825164064c8f3d5a8a7']], ['b45be0a0000bd9cb6e77ffe40e73578ec5d276a22b40f5c2508f056d6c5bec56', 6, 15, ['b703a38bb22b758c5c23c08f096b6c3155c56885d57e1280ff521126282fa857', 'b59f0967fa41b6e5ef76d7adef6dff327d60cb23fcaf54361c93e0b07850d4b4', 'df6350b39f2cdc5e768d4f99b129c5c288c7feafb4132c5346535ecdc9c8ed0c', '21531f0f5e521ba665dee3cfcc45045336e132418975e1c5162f1e204d8e69ba'], 3, ['3eab3273f262d71caa9ff9d40c116f5b3830dd679009019ecdf6c8a99aa16b58', 'ea63a021f2e23e6c7fe7cfc0a23b02ac0c86da154780b3b345d8fe8e0ab6355b', 'df6350b39f2cdc5e768d4f99b129c5c288c7feafb4132c5346535ecdc9c8ed0c', '21531f0f5e521ba665dee3cfcc45045336e132418975e1c5162f1e204d8e69ba']], ['8c9b7ba673626a25f8be58a42a1da8c869f2f099be04aa0883c06c5de2e48421', 5, -2, ['2a2fdf4fdfa740e90aee72db91e9e30c5488b7baad7cb8f633bf8022e87123d7', 'efcc30e5d5f718e13bfc401af568ecc7c858e9d32133f4401cfb71cd38814f80', '464c696d1bcf7f072d0252b008bec082da9316e6f3d626b972c26c734c465a4e', 'cdbdc281f216d8039cd60662811ffac440ce75cb3a68ea493cf1fe90d6d93800'], -8, ['760ec1e7f2499f40bca055e466aeefdce261a2f00b34e30e449ba707badde8f0', 'e2779db0f1fb3daa77330825d9dca81df83d1161c50901e7821cdd4b51704051', '2dab2f542f028df4471570cee4b6380df685dd87da1101a539eb3faa0c656232', 'cdbdc281f216d8039cd60662811ffac440ce75cb3a68ea493cf1fe90d6d93800']], ['18108bd39bcec0b135b09ae67a0f3c08f0c0017038fd68564a83d261f8726081', 4, 12, ['a2fa87da1a398f68f723ddd48cf8c8c8b7160b84ca1e94c572204d727491c97d', '2bddb453fc7c6330c241d7fd889e5487cc36b44f87a00db55d70e6300c7f3ea0', 'a62f6dcd7b21781c7afe9a72779894e91da31a140cf56b3b0355d2fada237e54', '97fcb09c4f23cf88fcc2e9be3e4825eb579bef8681a9090c01b2131216157148'], 6, ['8ba02d540184b778d4e70c2e618f49e6cdd4cfd62bbb6ddc06456289c0946687', '7cb1248ba09cf265dba5be76af54b5de1d42f215f374b61d1affc0e81cb73410', 'a62f6dcd7b21781c7afe9a72779894e91da31a140cf56b3b0355d2fada237e54', '97fcb09c4f23cf88fcc2e9be3e4825eb579bef8681a9090c01b2131216157148']]]\n" 219 | ] 220 | }, 221 | { 222 | "data": { 223 | "text/plain": [ 224 | "True" 225 | ] 226 | }, 227 | "execution_count": 21, 228 | "metadata": {}, 229 | "output_type": "execute_result" 230 | } 231 | ], 232 | "source": [ 233 | "def get_proof(problem, assignment, num_queries):\n", 234 | " proof = []\n", 235 | " randomness_seed = problem[:]\n", 236 | " for i in range(num_queries):\n", 237 | " witness = get_witness(problem, assignment)\n", 238 | " tree = ZkMerkleTree(witness)\n", 239 | " random.seed(str(randomness_seed))\n", 240 | " query_idx = random.randint(0, len(problem))\n", 241 | " query_and_response = [tree.get_root()]\n", 242 | " query_and_response += [query_idx]\n", 243 | " query_and_response += tree.get_val_and_path(query_idx)\n", 244 | " query_and_response += tree.get_val_and_path((query_idx + 1) % len(witness))\n", 245 | " proof += [query_and_response]\n", 246 | " randomness_seed += [query_and_response]\n", 247 | " return proof\n", 248 | "\n", 249 | "def verify_proof(problem, proof):\n", 250 | " proof_checks_out = True\n", 251 | " randomness_seed = problem[:]\n", 252 | " for query in proof:\n", 253 | " random.seed(str(randomness_seed))\n", 254 | " query_idx = random.randint(0, len(problem))\n", 255 | " merkle_root = query[0]\n", 256 | " proof_checks_out &= query_idx == query[1]\n", 257 | " # Test witness properties.\n", 258 | " if query_idx < len(problem):\n", 259 | " proof_checks_out &= abs(query[2] - query[4]) == abs(problem[query_idx])\n", 260 | " else:\n", 261 | " proof_checks_out &= query[2] == query[4]\n", 262 | " # Authenticate paths\n", 263 | " proof_checks_out &= \\\n", 264 | " verify_zk_merkle_path(merkle_root, len(problem) + 1, query_idx, query[2], query[3])\n", 265 | " proof_checks_out &= \\\n", 266 | " verify_zk_merkle_path(merkle_root, len(problem) + 1, \\\n", 267 | " (query_idx + 1) % (len(problem) + 1), query[4], query[5])\n", 268 | " randomness_seed += [query]\n", 269 | " return proof_checks_out\n", 270 | "\n", 271 | "def test(q):\n", 272 | " problem = [1, 2, 3, 6, 6, 6, 12]\n", 273 | " assignment = [1, 1, 1, -1, -1, -1, 1]\n", 274 | " proof = get_proof(problem, assignment, q)\n", 275 | " print(proof)\n", 276 | " return verify_proof(problem, proof)\n", 277 | "\n", 278 | "test(4)" 279 | ] 280 | } 281 | ], 282 | "metadata": { 283 | "kernelspec": { 284 | "display_name": "Python 3 (ipykernel)", 285 | "language": "python", 286 | "name": "python3" 287 | }, 288 | "language_info": { 289 | "codemirror_mode": { 290 | "name": "ipython", 291 | "version": 3 292 | }, 293 | "file_extension": ".py", 294 | "mimetype": "text/x-python", 295 | "name": "python", 296 | "nbconvert_exporter": "python", 297 | "pygments_lexer": "ipython3", 298 | "version": "3.10.6" 299 | } 300 | }, 301 | "nbformat": 4, 302 | "nbformat_minor": 5 303 | } 304 | --------------------------------------------------------------------------------