forked from BeanstalkFarms/Multi-Flow-Pump-Whitepaper
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.tex
359 lines (286 loc) · 22.2 KB
/
main.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
\documentclass[tikz]{article}
% Packages
\usepackage[utf8]{inputenc} % Core latex bundle
\usepackage[a4paper, total={6in, 9in}]{geometry} % Customize document dimensions and formats
\usepackage{changepage} % Customize page layout in middle of document
\usepackage[table]{xcolor} % Add color to tables
\usepackage{standalone} % Add figures and tables from other files
\usepackage{import} % Import glossary
\usepackage{graphics} % General color and formats
\usepackage{url} % URL formatting
\usepackage{breakurl} % URL formatting
\usepackage{enumitem} % Format list spacing
\usepackage[hang]{footmisc} % Footnote margins
\usepackage{hyperref} % References
\usepackage{mathtools} % Useful tools for mathematical typesetting and replaces amsmath
\usepackage{amssymb,bm} % Math symbols
\usepackage{svg} % SVG
\usepackage{tikz} % Making charts
\usepackage{array,boldline,multirow,float,booktabs} % Added to make tables
\usepackage{stackengine} % Customize row heights
\usepackage{hhline} % Add double lines to table
\usepackage{multicol} % Two column lists
\usepackage{nicematrix} % Put table lines after color
\usepackage{wrapfig} % Wrap figures in text
\usepackage{tocloft,titletoc} % TOC package
\usepackage{titlesec} % Section spacing
% Paper formatting
\newlength\LabelWidth
\setlength\parindent{0pt}
\setlength{\parskip}{1em}
% Section spacing
\titlespacing*{\section}
{0pt}{0.6\baselineskip}{0.6\baselineskip} % Modify section spacing - first \baselineskip is spacing before, second is spacing after the section
\titlespacing*{\subsection}
{0pt}{0.6\baselineskip}{0.6\baselineskip} % Modify subsection spacing
\titlespacing*{\subsubsection}
{0pt}{0.6\baselineskip}{0.6\baselineskip} % Modify subsubsection spacing
% String formats
\newcommand{\code}[1]{\texttt{#1}}
\newcommand{\term}[1]{\textsl{#1}}
% Paper margins
\def\changemargin#1#2{\list{}{\rightmargin#2\leftmargin#1}\item[]}
\let\endchangemargin=\endlist
% Table of contents
\renewcommand{\contentsname}{Table of Contents}
\renewcommand{\cfttoctitlefont}{\Large\bfseries} % TOC title size
\renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}} % Add dots in TOC to sections
\renewcommand{\cftsecpagefont}{} % Remove \bfseries from section titles' page in TOC
% Section
\renewcommand*{\cftsecnumwidth}{2em} % Increase space section from numbers on left
% \setlength{\cftbeforesecskip}{3pt} % Messes with section TOC length
% Subsection
\cftsetindents{subsection}{1em}{3em} % space between numbers and toc subsections
\setlength{\cftsubsecindent}{2.5em} % subsection number spacing from left
\setlength{\cftbeforesubsecskip}{3pt} % Messes with subsection TOC length was 3pt
% Subsubsection
\cftsetindents{subsubsection}{1em}{4em} % space between numbers and toc subsubsections
\setlength{\cftsubsubsecindent}{5.5em} % subsubsection number spacing from leftindent
\setlength{\cftbeforesubsubsecskip}{3pt} % Messes with subsubsection TOC length was 3pt
% paragraph section
\setcounter{secnumdepth}{4}
\setcounter{tocdepth}{4}
\cftsetindents{paragraph}{1em}{5em} % space between numbers and toc paragraph
\setlength{\cftparaindent}{9.5em} % paragraph number spacing from leftindent
\setlength{\cftbeforeparaskip}{3pt} % Messes with paragraph TOC length was 3pt
% indent after paragraph section
\titleformat{\paragraph}
{\normalfont\normalsize\bfseries}{\theparagraph}{1em}{}
\titlespacing*{\paragraph}
{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
% Abstract
% Make abstract justified
\makeatletter
\newcommand{\justified}{
\rightskip\z@skip
\leftskip\z@skip}
\makeatother
% Format and size abstract
\makeatletter
\renewenvironment{abstract}{
\if@twocolumn
\section*{\abstractname}
\else
\begin{center}
{\bfseries \large\abstractname\vspace{\z@}} % Bolds abstract name
\end{center}
\quotation
\fi}
{\if@twocolumn\else\endquotation\fi}
\makeatother
% Delimiters
\DeclarePairedDelimiter\floor{\lfloor}{\rfloor} % Define paired delimiter for floor function
\DeclarePairedDelimiter{\ceil}{\lceil}{\rceil} % Define paired delimiter for ceiling function
% Hyperlinks
\hypersetup{
colorlinks=true,
linkcolor=black,
filecolor=blue,
urlcolor=black,
}
\urlstyle{same}
% Footnotes
\newcommand{\fref}[1]{\footnote{\href{http://#1}{#1}}}
\setlength{\footnotemargin}{8mm} % Spacing between footnote number and body
% Include tables
\makeatletter
\newcommand{\includetable}[1]{%
\@ifundefined{tablepath}{%
\InputIfFileExists{#1}{}{}%
}{%
\InputIfFileExists{\tablepath/#1}{}{\InputIfFileExists{#1}{}{}}%
}
}
\makeatother
% Table formatting commands
\newcolumntype{Q}{ >{\centering\arraybackslash} m{2.4cm} } % (Figure 5 and 11 - col width)
\newcolumntype{S}{ >{\centering\arraybackslash} m{5.27cm} } % (Figure 12 - col width double)
\newcommand\xrowht[2][0]{\addstackgap[.5\dimexpr#2\relax]{\vphantom{#1}}} % Set row height for tables
\newcommand{\rowh}[1]{\xrowht{40pt}} % Command to set row height for cell with 3 rows
\newcommand{\rowm}[1]{\xrowht{26.667pt}} % Command to set row height for cell with 2 rows
\newcommand{\rows}[1]{\xrowht{13.333pt}} % Command to set row height for cell with 1 rows
% Bean symbols
\newcommand{\BeanCover}{\includesvg[scale=2.2]{./logos/black-bean.svg}} % Logo on cover page
\newcommand{\Bean}{\includesvg[scale=0.23]{./logos/bean.svg}} % Bean used throughout the paper in text form
\newcommand{\bean}{\includesvg[scale=0.17]{./logos/microbean-wide.svg}} % Bean used in formulas - micro bean wide
\newcommand{\tinybean}{\includesvg[scale=0.13]{./logos/microbean-wide.svg}} % Bean used in formulas - micro bean wide
\newcommand{\lambdabean}{\includesvg[scale=0.17]{./logos/microbean.svg}} % Bean used in formulas for lambda superscript - micro bean
% Pump symbols
\newcommand{\PumpCover}{\includesvg[scale=0.25]{./logos/multi-flow.svg}} % Logo on cover page
% List Key
\SetEnumitemKey{midsep}{topsep=0pt, itemsep=3pt} % Itemize key
% File paths
\newcommand{\tablepath}{figures} % Tables file path
\graphicspath{{figures/}} % Figures file path
%%%%%%% Begin Document %%%%%%%
\begin{document}
\pagenumbering{arabic} % Start page numbering style
\thispagestyle{empty} % Hide page numbering
\begin{titlepage}
\begin{center}
\begin{changemargin}{-2.5cm}{-2.5cm}
\centering % added to center title
\textbf{\large{Multi Flow: Inter-block MEV Manipulation Resistant Pump For Current Values}}
\end{changemargin}
\begin{center}
\vspace{0.4cm}
\PumpCover
\end{center}
\vspace{0.4cm}
\begin{center}
\begin{tabular}{>{\centering\arraybackslash}p{5cm} >{\centering\arraybackslash}p{5cm}}
\large{Brendan Sanderson} & \large{Ben Weintraub} \\
\href{mailto:brendan@manifestcrypto.org}{\normalsize{brendan@manifestcrypto.org}} & \href{mailto:ben@manifestcrypto.org}{\normalsize{ben@manifestcrypto.org}}
\end{tabular}
\end{center}
\vspace{-0.25cm}
\normalsize{\href{https://basin.exchange/}{basin.exchange}}
\vspace{0.4cm}
\footnotesize{Published:} \normalsize{August 23, 2023}
\vspace{-0.25cm}
\footnotesize{Modified:} \normalsize{August 23, 2023}
\vspace{-0.25cm}
\footnotesize{Whitepaper Version:} {\normalsize{1.0.0}}
\vspace{-0.25cm}
\footnotesize{Code Version:} \href{https://github.com/BeanstalkFarms/Basin/blob/master/src/pumps/MultiFlowPump.sol}{\normalsize{1.0.0}}\footnote{\href{https://github.com/BeanstalkFarms/Basin/blob/master/src/pumps/MultiFlowPump.sol}{github.com/BeanstalkFarms/Basin/blob/master/src/pumps/MultiFlowPump.sol}}
\vspace{0.1cm}
\flushleft{\normalsize{\term{“So we sailed on through the narrow straits, crying aloud for fear of Scylla on the one hand while divine Charybdis sucked the sea in terribly on the other.”}}}
\normalsize{\hspace{2.5em}- Homer, The Odyssey}\fref{poetryintranslation.com/PITBR/Greek/Odyssey12.php}
\vspace{0.4cm}
\begin{abstract}
\justified{\normalsize{\noindent Oracles are a core piece of the decentralized finance tech stack. Non-network-native oracles that require additional trust assumptions beyond the integrity of the network are the only current option for EVM-native protocols in a post-Merge\fref{ethereum.org/en/roadmap/merge} environment because current network-native oracles are not resistant to inter-block maximum extractable value (MEV) manipulation. We propose an inter-block MEV manipulation resistant network-native oracle for arbitrary current data in an EVM for both instantaneous and time-weighted average (TWA) values.}}
\end{abstract}
\end{center}
\end{titlepage}
\newpage
% TOC formatting
% \addtocontents{toc}{\protect\enlargethispage{20mm}} % TOC margins
\thispagestyle{empty} % Hide TOC page numbering
\addtocontents{toc}{\protect\thispagestyle{empty}} % Allow hiding both TOC page numbers
\cleardoublepage
\pagenumbering{gobble}
{\large\tableofcontents} % Compile TOC with large font
\cleardoublepage
\pagenumbering{arabic}
% \thispagestyle{empty} % Hide TOC page numbering
% \addtocontents{toc}{\protect\thispagestyle{empty}} % Allow hiding both TOC page numbers
\newpage
\setcounter{page}{3} % Begin page numbering
\section{Introduction}
Oracles are a principle component of complex network-native financial activity: network-native contracts often require oracles to report external data to process transactions. Oracle data can be bifurcated into data that is native to the network of the contracts using the oracle data and data that is not native to the network. Whereas data that is not native to the network must be reported to the network through some external oracle system that requires additional trust assumptions beyond the integrity of the network itself, data that is native to the network can be reported through a network-native oracle that does not. However, there are no current Ethereum-native oracles for Ethereum-native data that offer manipulation resistance in a post-Merge environment.
Prior to the Merge the potential for “risk-free” manipulation resistance was limited to intra-block (\textit{i.e.}, within a single block) manipulation. However, the Merge created the potential for “risk-free” inter-block (\textit{i.e.}, across multiple blocks) manipulation because block proposers are known at the beginning of each epoch. When the same proposer (or a coordinated set of proposers) knows they get to propose multiple consecutive blocks, they can execute arbitrary activity acceptable to the network (\textit{e.g.}, buy as much of an asset as possible) without risk of having any transactions processed that cost them anything (\textit{e.g.}, selling the asset at its now elevated price) until the first block proposed by others. In practice, there is no way to prevent inter-block manipulation from inter-block MEV. Therefore, network-native oracles must be resistant to inter-block manipulation as much as possible. However, all oracles for network-native data that were implemented prior to the Merge lack inter-block manipulation resistance. The occurrence of consecutive blocks being proposed by the same proposer is high enough\fref{alrevuelta.github.io/posts/ethereum-mev-multiblock} such that current network-native oracles are unusable for any protocol that requires manipulation resistant oracles.
\vspace*{-1mm}
\begin{figure}[h!]
\centering
\includegraphics[scale=.25]{Figure15}
\vspace*{-7mm}
\caption{Inter-Block MEV Occurrences Per Year By Validator Ownership Percent}
\label{fig 2}
\end{figure}
%\vspace*{-5mm}
Basin is a composable decentralized exchange (DEX) architecture native to the EVM.\footnote{\href{https://basin.exchange/basin.pdf}{basin.exchange/basin.pdf}} Pumps are the generalized oracle component of Basin. The ability to compose together arbitrary exchange functions and oracles with Basin allows for the combination of existing exchange functions that remain popular for network-native exchanges with new network-native oracles that are inter-block MEV manipulation resistant.
Oracle data can be further classified as current or historical data, and instantaneous or TWA. Whereas there is inherently no network-native oracle for non-network-native data, there are potential network-native oracles for current and historical data of instantaneous and TWA values. Multi Flow supports current instantaneous and TWA values to allow for any network-native protocol to access manipulation resistant current data without additional trust assumptions beyond the integrity of the network and the Multi Flow implementation.
\section{Previous Work}
Multi Flow is the next step in the evolution of EVM-native oracles for current values.
A robust, trustless computer network that supports composability and fungible token standards (\textit{e.g.}, Ethereum) is necessary to host a DEX. A DEX that supports (1) the composition of other components of an exchange with arbitrary oracles (\textit{i.e.}, Basin) and (2) an interface for arbitrary oracles (\textit{i.e.}, \term{Pumps}) is necessary to support Multi Flow.
Uniswap V2\fref{uniswap.org/whitepaper.pdf} implemented a TWA network-native oracle for assets being traded in a Uniswap V2 liquidity pool by saving a cumulative sum of the price of the pool at the end of each block. Using the end of block price prevents intra-block manipulation but does not provide any inter-block manipulation resistance. The Uniswap V2 oracle lacks support for an inter or intra-block manipulation resistant instantaneous price.
Uniswap V3\fref{uniswap.org/whitepaper-v3.pdf} innovated further on manipulation resistant network-native oracles for TWA values by moving from a simple moving average (SMA) of an arithmetic mean,\fref{uniswap.org/whitepaper.pdf} which weights outliers equally to all other data points, to an SMA of a geometric mean, which weights certain outliers significantly less. In addition to price, the oracle also stores data related to the liquidity in the pool, such that a time and liquidity-weighted average price can be measured. However, the Uniswap V3 oracle also lacks inter-block manipulation resistance for TWA values and supports neither an inter nor intra-block manipulation resistant instantaneous price.
Curve\fref{etherscan.io/token/0xc9c32cd16bf7efb85ff14e0c8603cc90f6f2ee49} implemented an intra-block manipulation resistant instantaneous price oracle using the price at the end of the last block. The Curve oracle lacks support for an inter-block manipulation resistant instantaneous price.
\section{Multi Flow}
Multi Flow uses a two-step approach to create a network-native inter-block MEV manipulation resistant oracle from manipulable data. First, Multi Flow “cleans” the data by calculating inter-block MEV manipulation resistant last values. Then, using the manipulation resistant last values, Multi Flow calculates current instantaneous and TWA inter-block MEV manipulation resistant values.
In practice, Multi Flow stores 3 different types of values ($x$) at the last updated timestamp ($l$), such that $l, x \in \mathbb{Z}^{+}$:
\begin{itemize}
\item Inter-block MEV manipulation resistant last values $[x^{\text{LAST}}_{0,l}, \cdots, x^{\text{LAST}}_{n,l}]$;
\item Inter-block MEV manipulation resistant Geometric EMA values $[x^{\text{EMA}}_{0,l}, \cdots, x^{\text{EMA}}_{n,l}]$; and
\item Inter-block MEV manipulation resistant Cumulative Geometric SMA values $[x^{\text{SMA}}_{0,l}, \cdots, x^{\text{SMA}}_{n,l}]$.
\end{itemize}
The second log of each value is stored. To properly read each value from Multi Flow, it must be converted back to its original value ($y$), such that $y \in \mathbb{Z}^{+}$. In the case of the TWA inter-block MEV manipulation resistant value, two values of x (\textit{i.e.}, from the beginning and end of the period over which the TWA is being measured ($t_0$ and $t_1$, respectively) such that $t_0,\ t_1 \in \mathbb{Z}^{+}$) must be used. Therefore, Multi Flow supports 3 different types of values:
\begin{itemize}
\item Inter-block MEV manipulation resistant last values $[y^{\text{LAST}}_{0,l}, \cdots, y^{\text{LAST}}_{n,l}]$;
\item Inter-block MEV manipulation resistant Geometric EMA values $[y^{\text{EMA}}_{0,l}, \cdots, y^{\text{EMA}}_{n,l}]$; and
\item Inter-block MEV manipulation resistant TWA Geometric SMA values $[y^{\text{SMA}}_{0,t_0,t_1}, \cdots, y^{\text{SMA}}_{n,t_0,t_1}]$.
\end{itemize}
Multi Flow supports reading values at both $l$ and the current timestamp $t$, such that $l \leq t$, $t \in \mathbb{Z}^{+}$.
\subsection{Inter-Block MEV Manipulation Resistant Last Values}
In a post-Merge inter-block MEV susceptible environment there is no way for network-native oracles to know whether the data at the beginning or end of a particular transaction or block is being manipulated or not. In practice this means that oracles must assume the potential for manipulation of every value. Therefore, the fundamental question for manipulation resistant oracles in an inter-block MEV environment is around the treatment of statistical outliers which are certain to exist with no way for the oracle to know if it is the result of honest network activity or manipulation.
Multi Flow calculates the inter-block MEV manipulation resistant last values by using a cap on the maximum percent change of the values acceptable per block. The cap limits the extent of manipulation over a given number of blocks and in doing so “cleans” the data for postprocessing into current instantaneous and TWA oracle values.
For a given maximum increase permitted of a value per block ($\gamma_+$), maximum decrease permitted of a value per block ($\gamma_-$), block time of the given EVM in seconds ($\beta$), such that $\gamma_+,\ \gamma_-,\ \beta, \in \mathbb{Z}^{+}$, and the current values ($[x_{0,t}, \cdots, x_{n,t}]$), Multi Flow updates $[x^{\text{LAST}}_{0,l}, \cdots, x^{\text{LAST}}_{n,l}]$ at timestamp $t$ as:
$$
x^{\text{LAST}}_{i,t} =
\begin{cases}
\text{min}\left(x_{i,t}, x^{\text{LAST}}_{i,l}(1+\gamma_+)^\frac{t-l}{\beta}\right) & x_{i,t} > x^{\text{LAST}}_{i,l} \\
\text{max}\left(x_{i,t}, x^{\text{LAST}}_{i,l}(1-\gamma_-)^\frac{t-l}{\beta}\right) & \text{otherwise} \\
\end{cases}
$$
Because exponentiation is expensive in the EVM, in practice $[x^{\text{LAST}}_{0,l}, \cdots, x^{\text{LAST}}_{n,l}]$ is updated at $t$ as:
$$
x^{\text{LAST}}_{i,t} =
\begin{cases}
\text{min}\left(log_2(x_{i,t}), x^{\text{LAST}}_{i,l} + log_2(1+\gamma_+) \frac{t-l}{\beta}\right) & log_2(x_{i,t}) > x^{\text{LAST}}_{i,l} \\
\text{max}\left(log_2(x_{i,t}), x^{\text{LAST}}_{i,l} + log_2(1-\gamma_-) \frac{t-l}{\beta}\right) & \text{otherwise} \\
\end{cases}
$$
Therefore, the multi-block MEV manipulation resistant last values can be read as:
$$
y^{\text{LAST}}_{i,l} = 2^{x^{\text{LAST}}_{i,l}}
$$
\subsection{Inter-Block MEV Manipulation Resistant Instantaneous Values}
Multi Flow uses an exponential moving average (EMA) of the inter-block MEV manipulation resistant last values to calculate inter-block MEV manipulation resistant current instantaneous values. EMAs are useful for aggregating a time-series of data into a single value and are preferable to SMAs for instantaneous value because (1) they weight recent data more than older data and (2) instances where the direction in the deviations of the new last value and EMA value from the old ones are different are much more limited in frequency and scale (\textit{i.e.}, their changes are directionally the same more often). An EMA of the inter-block MEV manipulation resistant last values is preferable to the inter-block MEV manipulation resistant last values for reading an instantaneous value because it requires manipulation over extended periods of time to significantly manipulate the value.
For a given exponential decay parameter ($\alpha$), such that $\alpha \in (0,1)$, $[x^{\text{EMA}}_{0,l}, \cdots, x^{\text{EMA}}_{n,l}]$ and $[x^{\text{LAST}}_{0,t}, \cdots, x^{\text{LAST}}_{n,t}]$, Multi Flow updates $[x^{\text{EMA}}_{0,t}, \cdots, x^{\text{EMA}}_{n,t}]$ at timestamp $t$ as:
$$
x^{\text{EMA}}_{i,t} = \alpha^{t-l} x^{\text{EMA}}_{i,l} + (1 - \alpha^{t-l}) x^{\text{LAST}}_{i,t}
$$
Therefore, the inter-block MEV manipulation resistant current instantaneous values can be read as:
$$
y^{\text{EMA}}_{i,l} = 2^{x^{\text{EMA}}_{i,l}}
$$
\subsection{Inter-Block MEV manipulation resistant TWA Values}
Multi Flow uses a cumulative sum of the inter-block MEV manipulation resistant last values to calculate inter-block MEV manipulation resistant SMA values. SMAs are useful for aggregating a time-series of data into a single value and are preferable to EMAs for TWA value because they weight recent data the same as older data.
For a given $[x^{\text{SMA}}_{0,l}, \cdots, x^{\text{SMA}}_{n,l}]$ and $[x^{\text{LAST}}_{0,t}, \cdots, x^{\text{LAST}}_{n,t}]$, Multi Flow updates $[x^{\text{SMA}}_{0,t}, \cdots, x^{\text{SMA}}_{n,t}]$ at timestamp $t$ as:
$$
x^{\text{SMA}}_{i,t} = x^{\text{SMA}}_{i,l} + (t-l) x^{\text{LAST}}_{i,t}
$$
Therefore, the inter-block MEV manipulation resistant TWA values can be calculated from $x^{\text{SMA}}_{i,t_0}$ and $x^{\text{SMA}}_{i,t_1}$ as:
$$
y^{\text{SMA}}_{i,t_0,t_1} = 2^{\frac{x^{\text{SMA}}_{i,t_1} - x^{\text{SMA}}_{i,l}}{t_1-t_0}}
$$
Because only the latest values of $[x^{\text{SMA}}_{0,l}, \cdots, x^{\text{SMA}}_{n,l}]$ are stored by Multi Flow, protocols must save values at the beginning of the period over which the TWA is being measured.
\subsection{Governance}
Multi Flow is non-upgradable. Therefore, Multi Flow does not support governance.
\vspace{-1mm}
\section{Risks}
\vspace{-1mm}
There are risks associated with Multi Flow. This is not an exhaustive list.
The Multi Flow code base is novel. It has not been tested in the “real world” prior to its initial deployment. The open source nature of Multi Flow means that others can take advantage of any bugs, flaws or deficiencies in it. While Multi Flow has been audited\footnote{\href{https://basin.exchange/06-16-23-halborn-report}{basin.exchange/06-16-23-halborn-report}}$^{,}$\footnote{\href{https://basin.exchange/06-16-23-cyfrin-report}{basin.exchange/06-16-23-cyfrin-report}} it is no guarantee of security.
Multi Flow does not prevent manipulation of network-native values. Instead, it minimizes the effect of manipulation on oracle values. Therefore, Multi Flow is manipulation resistant, not manipulation-preventing.
\vspace{-1mm}
\section{Future Work}
\vspace{-1mm}
Manipulation resistant network-native oracles are a work in progress. The following are some potential improvements that can be incorporated into future iterations of manipulation resistant network-native oracles:
\begin{itemize}
\item Support for historical values.
\item Support for additional data (\textit{e.g.}, volatility).
\item The ability to turn off when manipulation is detected.
\item The ability to reset if it breaks.
\end{itemize}
\end{document}