-
Notifications
You must be signed in to change notification settings - Fork 5
/
airseeker_v2_pipeline.drawio
213 lines (213 loc) · 24.1 KB
/
airseeker_v2_pipeline.drawio
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
<mxfile host="65bd71144e">
<diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">
<mxGraphModel dx="1452" dy="415" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="3300" pageHeight="4681" math="0" shadow="0">
<root>
<mxCell id="WIyWlLk6GJQsqaUBKTNV-0"/>
<mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0"/>
<mxCell id="ci7EG28U3f9VGxeywyoC-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-28" target="ci7EG28U3f9VGxeywyoC-34" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="HytMPlxkX1mnba_mCnJT-0" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-28" target="ci7EG28U3f9VGxeywyoC-115" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-28" value="Repeat indefinitely, after every<br><i>signedDataFetchInterval.<br></i>" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="80" y="800" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-29" value="<font style=""><b><font style="font-size: 15px;">Signed data fetching loop</font></b><br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="80" y="760" width="240" height="40" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-39" value="for each<br>in parallel" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-34" target="ci7EG28U3f9VGxeywyoC-38" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-34" value="Get all active Airnode addresses and their respective signed API URLs." style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="480" y="800" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-35" value="State" style="ellipse;whiteSpace=wrap;html=1;rounded=1;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="480" y="960" width="80" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-41" value="for all<br>responses" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-38" target="ci7EG28U3f9VGxeywyoC-40" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-38" value="Call signed API URLs in parallel." style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="880" y="800" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-47" value="for all valid<br>responses" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-40" target="ci7EG28U3f9VGxeywyoC-44" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-40" value="Validate signatures and timestamps." style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="1280" y="800" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-44" value="Persist the signed data per beacon." style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="1680" y="800" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-45" value="write to" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-44" target="ci7EG28U3f9VGxeywyoC-46" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1800" y="910" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-46" value="State" style="ellipse;whiteSpace=wrap;html=1;rounded=1;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="1760" y="960" width="80" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-52" value="independently for <br>each sub-loop" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-49" target="ci7EG28U3f9VGxeywyoC-51" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-49" value="For each provider across all chains run a separate sub-loop." style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="80" y="1479" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-50" value="<font style=""><b><font style="font-size: 15px;">Data feed update loop</font></b><br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="80" y="1439" width="240" height="40" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-51" target="ci7EG28U3f9VGxeywyoC-53" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-127" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" target="ci7EG28U3f9VGxeywyoC-126" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="600" y="1568" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-51" value="Repeat indefinitely, after every&nbsp;<i>updateInterval.</i><span id="docs-internal-guid-16fcbaba-7fff-21a4-d981-8a314591bee4"></span>" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="480" y="1479" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-60" value="for each batch<br>in a single RPC call<br>in a staggered way" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-53" target="ci7EG28U3f9VGxeywyoC-57" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-53" value="Multicall to get the first batch of active data feeds along with their count." style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="880" y="1479" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-55" value="fetch&nbsp;from" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-53" target="ci7EG28U3f9VGxeywyoC-56" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1000" y="1599.0000000000002" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-56" value="Chain" style="rhombus;whiteSpace=wrap;html=1;rounded=1;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="960" y="1639" width="80" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-70" value="for all active data<br>feeds in the batch" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-57" target="ci7EG28U3f9VGxeywyoC-69" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-57" value="" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="1280" y="1479" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-58" value="fetch&nbsp;from" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-57" target="ci7EG28U3f9VGxeywyoC-59" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1400" y="1599.0000000000002" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-59" value="Chain" style="rhombus;whiteSpace=wrap;html=1;rounded=1;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="1360" y="1639" width="80" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-61" value="Call signed API URLs in parallel." style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="890" y="810" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-62" value="Call signed API URL." style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="900" y="820" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-69" value="Persist the Airnode addresses, template IDs, signed API URLs and on-chain values for these data feeds." style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="1680" y="1479" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-74" value="write to" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-69" target="ci7EG28U3f9VGxeywyoC-75" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1820" y="1576.5" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-75" value="State" style="ellipse;whiteSpace=wrap;html=1;rounded=1;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="1760" y="1639" width="80" height="81" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-87" value="for all data feeds" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" target="ci7EG28U3f9VGxeywyoC-86" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1920" y="1520" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-78" value="" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="1290" y="1490" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-79" value="Fetch the rest of the active data feed batches together with Airnode address, template ID(s), signed API URLs and on-chain values." style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="1300" y="1499" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-89" value="if there is any data feed<br>to be updated" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-86" target="ci7EG28U3f9VGxeywyoC-88" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-86" value="Determine which data feeds need to <br>be updated." style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="2080" y="1480" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-91" value="for each data feed that <br>needs to be updated" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-88" target="ci7EG28U3f9VGxeywyoC-90" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-88" value="Run gas collector and calculate gas price<br>(once for all data feeds)." style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="2480" y="1480" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-97" value="for each update <br>transaction" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-90" target="ci7EG28U3f9VGxeywyoC-96" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-90" value="Create a multicall update transaction with <br>respective sponsor wallet." style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="2880" y="1480" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-96" value="Submit a multicall transaction." style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="3280" y="1480" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-104" value="to" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-96" target="ci7EG28U3f9VGxeywyoC-105" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="3370" y="1700" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-105" value="Chain" style="rhombus;whiteSpace=wrap;html=1;rounded=1;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="3360" y="1639" width="80" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-109" value="Config" style="ellipse;whiteSpace=wrap;html=1;rounded=1;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="640" y="960" width="80" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-114" value="read<i style="border-color: var(--border-color); font-size: 12px; background-color: rgb(251, 251, 251);">&nbsp;signedDataFetchInterval<br></i>from" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" target="ci7EG28U3f9VGxeywyoC-115" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="200" y="880" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-115" value="Config" style="ellipse;whiteSpace=wrap;html=1;rounded=1;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="160" y="960" width="80" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-33" value="read from&nbsp;" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-34" target="ci7EG28U3f9VGxeywyoC-35" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-110" value="read from" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ci7EG28U3f9VGxeywyoC-34" target="ci7EG28U3f9VGxeywyoC-109" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-116" value="merge" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=default;container=0;strokeWidth=0;fontSize=12;spacing=0;imageWidth=20;imageHeight=20;imageAspect=1;rounded=1;shadow=0;sketch=1;curveFitting=1;jiggle=2;glass=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="575" y="885" width="50" height="20" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-125" value="read<i style="border-color: var(--border-color); font-size: 12px; background-color: rgb(251, 251, 251);">&nbsp;</i><i style="border-color: var(--border-color); font-size: 12px; background-color: rgb(251, 251, 251);">dataFeedUpdateInterval</i><br>from" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" target="ci7EG28U3f9VGxeywyoC-126" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="600" y="1559" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-126" value="Config" style="ellipse;whiteSpace=wrap;html=1;rounded=1;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="560" y="1639" width="80" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-128" value="Repeat indefinitely, after every&nbsp;<i>updateInterval.</i><span id="docs-internal-guid-16fcbaba-7fff-21a4-d981-8a314591bee4"></span>" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="490" y="1489" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="ci7EG28U3f9VGxeywyoC-129" value="Repeat indefinitely, after every&nbsp;<i>dataFeedUpdateInterval.</i><span id="docs-internal-guid-16fcbaba-7fff-21a4-d981-8a314591bee4"></span>" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="500" y="1499" width="240" height="80" as="geometry"/>
</mxCell>
<mxCell id="_6md9EJBx8UnATQNPtMW-14" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="_6md9EJBx8UnATQNPtMW-5" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="2310" y="1344" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="_6md9EJBx8UnATQNPtMW-5" value="for each sponsor /dataFeedId pair where an update is not needed" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="2170" y="1329" width="60" height="30" as="geometry"/>
</mxCell>
<mxCell id="_6md9EJBx8UnATQNPtMW-7" value="" style="endArrow=none;html=1;rounded=0;strokeColor=default;endFill=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="2199.41" y="1480" as="sourcePoint"/>
<mxPoint x="2199" y="1399" as="targetPoint"/>
<Array as="points"/>
</mxGeometry>
</mxCell>
<mxCell id="_6md9EJBx8UnATQNPtMW-18" value="clear stored last update timestamp value from gas price store" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;align=center;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="2310" y="1304" width="240" height="80" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>