@trufnetwork/sdk-js 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +91 -13
  2. package/dist/cjs/client/client.cjs +41 -32
  3. package/dist/cjs/client/client.cjs.map +2 -2
  4. package/dist/cjs/client/getLastTransactions.cjs +67 -0
  5. package/dist/cjs/client/getLastTransactions.cjs.map +7 -0
  6. package/dist/cjs/client/listStreams.cjs +46 -0
  7. package/dist/cjs/client/listStreams.cjs.map +7 -0
  8. package/dist/cjs/contracts-api/{stream.cjs → action.cjs} +140 -159
  9. package/dist/cjs/contracts-api/action.cjs.map +7 -0
  10. package/dist/cjs/contracts-api/composedAction.cjs +183 -0
  11. package/dist/cjs/contracts-api/composedAction.cjs.map +7 -0
  12. package/dist/cjs/contracts-api/{destroyStream.cjs → deleteStream.cjs} +16 -16
  13. package/dist/cjs/contracts-api/deleteStream.cjs.map +7 -0
  14. package/dist/cjs/contracts-api/deployStream.cjs +33 -16
  15. package/dist/cjs/contracts-api/deployStream.cjs.map +3 -3
  16. package/dist/cjs/contracts-api/primitiveAction.cjs +92 -0
  17. package/dist/cjs/contracts-api/primitiveAction.cjs.map +7 -0
  18. package/dist/cjs/index.common.cjs +6 -6
  19. package/dist/cjs/index.common.cjs.map +1 -1
  20. package/dist/cjs/types/transaction.cjs +19 -0
  21. package/dist/cjs/types/transaction.cjs.map +7 -0
  22. package/dist/cjs/util/EthereumAddress.cjs +0 -1
  23. package/dist/cjs/util/EthereumAddress.cjs.map +2 -2
  24. package/dist/cjs/util/StreamId.cjs +7 -2
  25. package/dist/cjs/util/StreamId.cjs.map +2 -2
  26. package/dist/esm/client/client.mjs +41 -32
  27. package/dist/esm/client/client.mjs.map +2 -2
  28. package/dist/esm/client/getLastTransactions.mjs +46 -0
  29. package/dist/esm/client/getLastTransactions.mjs.map +7 -0
  30. package/dist/esm/client/listStreams.mjs +25 -0
  31. package/dist/esm/client/listStreams.mjs.map +7 -0
  32. package/dist/esm/contracts-api/{stream.mjs → action.mjs} +137 -156
  33. package/dist/esm/contracts-api/action.mjs.map +7 -0
  34. package/dist/esm/contracts-api/composedAction.mjs +156 -0
  35. package/dist/esm/contracts-api/composedAction.mjs.map +7 -0
  36. package/dist/esm/contracts-api/deleteStream.mjs +24 -0
  37. package/dist/esm/contracts-api/deleteStream.mjs.map +7 -0
  38. package/dist/esm/contracts-api/deployStream.mjs +23 -21
  39. package/dist/esm/contracts-api/deployStream.mjs.map +2 -2
  40. package/dist/esm/contracts-api/primitiveAction.mjs +71 -0
  41. package/dist/esm/contracts-api/primitiveAction.mjs.map +7 -0
  42. package/dist/esm/index.common.mjs +6 -6
  43. package/dist/esm/index.common.mjs.map +1 -1
  44. package/dist/esm/types/transaction.mjs +1 -0
  45. package/dist/esm/types/transaction.mjs.map +7 -0
  46. package/dist/esm/util/EthereumAddress.mjs +0 -1
  47. package/dist/esm/util/EthereumAddress.mjs.map +2 -2
  48. package/dist/esm/util/StreamId.mjs +7 -2
  49. package/dist/esm/util/StreamId.mjs.map +2 -2
  50. package/dist/tsconfig.build.tsbuildinfo +1 -1
  51. package/dist/types/client/client.d.ts +38 -15
  52. package/dist/types/client/client.d.ts.map +1 -1
  53. package/dist/types/client/getLastTransactions.d.ts +5 -0
  54. package/dist/types/client/getLastTransactions.d.ts.map +1 -0
  55. package/dist/types/client/listStreams.d.ts +12 -0
  56. package/dist/types/client/listStreams.d.ts.map +1 -0
  57. package/dist/types/contracts-api/action.d.ts +136 -0
  58. package/dist/types/contracts-api/action.d.ts.map +1 -0
  59. package/dist/types/contracts-api/{composedStream.d.ts → composedAction.d.ts} +11 -22
  60. package/dist/types/contracts-api/composedAction.d.ts.map +1 -0
  61. package/dist/types/contracts-api/{destroyStream.d.ts → deleteStream.d.ts} +7 -7
  62. package/dist/types/contracts-api/deleteStream.d.ts.map +1 -0
  63. package/dist/types/contracts-api/deployStream.d.ts +2 -2
  64. package/dist/types/contracts-api/deployStream.d.ts.map +1 -1
  65. package/dist/types/contracts-api/primitiveAction.d.ts +33 -0
  66. package/dist/types/contracts-api/primitiveAction.d.ts.map +1 -0
  67. package/dist/types/index.common.d.ts +7 -7
  68. package/dist/types/types/transaction.d.ts +11 -0
  69. package/dist/types/types/transaction.d.ts.map +1 -0
  70. package/dist/types/util/EthereumAddress.d.ts.map +1 -1
  71. package/dist/types/util/StreamId.d.ts +2 -0
  72. package/dist/types/util/StreamId.d.ts.map +1 -1
  73. package/dist/types/util/visibility.d.ts.map +1 -1
  74. package/package.json +10 -6
  75. package/dist/cjs/client/listAllStreams.cjs +0 -51
  76. package/dist/cjs/client/listAllStreams.cjs.map +0 -7
  77. package/dist/cjs/contracts/composed_stream_template.json +0 -1638
  78. package/dist/cjs/contracts/composed_stream_template_unix.json +0 -2122
  79. package/dist/cjs/contracts/contractsContent.cjs +0 -65
  80. package/dist/cjs/contracts/contractsContent.cjs.map +0 -7
  81. package/dist/cjs/contracts/primitive_stream_template.json +0 -952
  82. package/dist/cjs/contracts/primitive_stream_template_unix.json +0 -1173
  83. package/dist/cjs/contracts-api/composedStream.cjs +0 -137
  84. package/dist/cjs/contracts-api/composedStream.cjs.map +0 -7
  85. package/dist/cjs/contracts-api/destroyStream.cjs.map +0 -7
  86. package/dist/cjs/contracts-api/primitiveStream.cjs +0 -86
  87. package/dist/cjs/contracts-api/primitiveStream.cjs.map +0 -7
  88. package/dist/cjs/contracts-api/stream.cjs.map +0 -7
  89. package/dist/esm/client/listAllStreams.mjs +0 -30
  90. package/dist/esm/client/listAllStreams.mjs.map +0 -7
  91. package/dist/esm/contracts/composed_stream_template.json +0 -1638
  92. package/dist/esm/contracts/composed_stream_template_unix.json +0 -2122
  93. package/dist/esm/contracts/contractsContent.mjs +0 -33
  94. package/dist/esm/contracts/contractsContent.mjs.map +0 -7
  95. package/dist/esm/contracts/primitive_stream_template.json +0 -952
  96. package/dist/esm/contracts/primitive_stream_template_unix.json +0 -1173
  97. package/dist/esm/contracts-api/composedStream.mjs +0 -116
  98. package/dist/esm/contracts-api/composedStream.mjs.map +0 -7
  99. package/dist/esm/contracts-api/destroyStream.mjs +0 -24
  100. package/dist/esm/contracts-api/destroyStream.mjs.map +0 -7
  101. package/dist/esm/contracts-api/primitiveStream.mjs +0 -65
  102. package/dist/esm/contracts-api/primitiveStream.mjs.map +0 -7
  103. package/dist/esm/contracts-api/stream.mjs.map +0 -7
  104. package/dist/types/client/listAllStreams.d.ts +0 -14
  105. package/dist/types/client/listAllStreams.d.ts.map +0 -1
  106. package/dist/types/contracts/contractsContent.d.ts +0 -6
  107. package/dist/types/contracts/contractsContent.d.ts.map +0 -1
  108. package/dist/types/contracts-api/composedStream.d.ts.map +0 -1
  109. package/dist/types/contracts-api/destroyStream.d.ts.map +0 -1
  110. package/dist/types/contracts-api/primitiveStream.d.ts +0 -39
  111. package/dist/types/contracts-api/primitiveStream.d.ts.map +0 -1
  112. package/dist/types/contracts-api/stream.d.ts +0 -142
  113. package/dist/types/contracts-api/stream.d.ts.map +0 -1
@@ -1,1638 +0,0 @@
1
- {
2
- "name": "composed_stream_db_name",
3
- "owner": "",
4
- "extensions": null,
5
- "tables": [
6
- {
7
- "name": "taxonomies",
8
- "columns": [
9
- {
10
- "name": "taxonomy_id",
11
- "type": {
12
- "name": "uuid",
13
- "is_array": false,
14
- "metadata": [0, 0]
15
- },
16
- "attributes": [
17
- {
18
- "type": "PRIMARY_KEY",
19
- "value": ""
20
- },
21
- {
22
- "type": "NOT_NULL",
23
- "value": ""
24
- }
25
- ]
26
- },
27
- {
28
- "name": "child_stream_id",
29
- "type": {
30
- "name": "text",
31
- "is_array": false,
32
- "metadata": [0, 0]
33
- },
34
- "attributes": [
35
- {
36
- "type": "NOT_NULL",
37
- "value": ""
38
- }
39
- ]
40
- },
41
- {
42
- "name": "child_data_provider",
43
- "type": {
44
- "name": "text",
45
- "is_array": false,
46
- "metadata": [0, 0]
47
- },
48
- "attributes": [
49
- {
50
- "type": "NOT_NULL",
51
- "value": ""
52
- }
53
- ]
54
- },
55
- {
56
- "name": "weight",
57
- "type": {
58
- "name": "decimal",
59
- "is_array": false,
60
- "metadata": [36, 18]
61
- },
62
- "attributes": [
63
- {
64
- "type": "NOT_NULL",
65
- "value": ""
66
- }
67
- ]
68
- },
69
- {
70
- "name": "created_at",
71
- "type": {
72
- "name": "int",
73
- "is_array": false,
74
- "metadata": [0, 0]
75
- },
76
- "attributes": [
77
- {
78
- "type": "NOT_NULL",
79
- "value": ""
80
- }
81
- ]
82
- },
83
- {
84
- "name": "disabled_at",
85
- "type": {
86
- "name": "int",
87
- "is_array": false,
88
- "metadata": [0, 0]
89
- },
90
- "attributes": null
91
- },
92
- {
93
- "name": "version",
94
- "type": {
95
- "name": "int",
96
- "is_array": false,
97
- "metadata": [0, 0]
98
- },
99
- "attributes": [
100
- {
101
- "type": "NOT_NULL",
102
- "value": ""
103
- }
104
- ]
105
- },
106
- {
107
- "name": "start_date",
108
- "type": {
109
- "name": "text",
110
- "is_array": false,
111
- "metadata": [0, 0]
112
- },
113
- "attributes": null
114
- }
115
- ],
116
- "indexes": null,
117
- "foreign_keys": null
118
- },
119
- {
120
- "name": "metadata",
121
- "columns": [
122
- {
123
- "name": "row_id",
124
- "type": {
125
- "name": "uuid",
126
- "is_array": false,
127
- "metadata": [0, 0]
128
- },
129
- "attributes": [
130
- {
131
- "type": "PRIMARY_KEY",
132
- "value": ""
133
- },
134
- {
135
- "type": "NOT_NULL",
136
- "value": ""
137
- }
138
- ]
139
- },
140
- {
141
- "name": "metadata_key",
142
- "type": {
143
- "name": "text",
144
- "is_array": false,
145
- "metadata": [0, 0]
146
- },
147
- "attributes": [
148
- {
149
- "type": "NOT_NULL",
150
- "value": ""
151
- }
152
- ]
153
- },
154
- {
155
- "name": "value_i",
156
- "type": {
157
- "name": "int",
158
- "is_array": false,
159
- "metadata": [0, 0]
160
- },
161
- "attributes": null
162
- },
163
- {
164
- "name": "value_f",
165
- "type": {
166
- "name": "decimal",
167
- "is_array": false,
168
- "metadata": [36, 18]
169
- },
170
- "attributes": null
171
- },
172
- {
173
- "name": "value_b",
174
- "type": {
175
- "name": "bool",
176
- "is_array": false,
177
- "metadata": [0, 0]
178
- },
179
- "attributes": null
180
- },
181
- {
182
- "name": "value_s",
183
- "type": {
184
- "name": "text",
185
- "is_array": false,
186
- "metadata": [0, 0]
187
- },
188
- "attributes": null
189
- },
190
- {
191
- "name": "value_ref",
192
- "type": {
193
- "name": "text",
194
- "is_array": false,
195
- "metadata": [0, 0]
196
- },
197
- "attributes": null
198
- },
199
- {
200
- "name": "created_at",
201
- "type": {
202
- "name": "int",
203
- "is_array": false,
204
- "metadata": [0, 0]
205
- },
206
- "attributes": [
207
- {
208
- "type": "NOT_NULL",
209
- "value": ""
210
- }
211
- ]
212
- },
213
- {
214
- "name": "disabled_at",
215
- "type": {
216
- "name": "int",
217
- "is_array": false,
218
- "metadata": [0, 0]
219
- },
220
- "attributes": null
221
- }
222
- ],
223
- "indexes": [
224
- {
225
- "name": "key_idx",
226
- "columns": ["metadata_key"],
227
- "type": "BTREE"
228
- },
229
- {
230
- "name": "ref_idx",
231
- "columns": ["value_ref"],
232
- "type": "BTREE"
233
- },
234
- {
235
- "name": "created_idx",
236
- "columns": ["created_at"],
237
- "type": "BTREE"
238
- }
239
- ],
240
- "foreign_keys": null
241
- }
242
- ],
243
- "actions": null,
244
- "procedures": [
245
- {
246
- "name": "stream_exists",
247
- "parameters": [
248
- {
249
- "name": "$data_provider",
250
- "type": {
251
- "name": "text",
252
- "is_array": false,
253
- "metadata": [0, 0]
254
- }
255
- },
256
- {
257
- "name": "$stream_id",
258
- "type": {
259
- "name": "text",
260
- "is_array": false,
261
- "metadata": [0, 0]
262
- }
263
- }
264
- ],
265
- "public": true,
266
- "modifiers": ["VIEW"],
267
- "body": "$dbid text := get_dbid($data_provider, $stream_id);\n\n for $row in SELECT * FROM get_metadata('type', true, null) {\n return true;\n }\n\n return false;",
268
- "return_types": {
269
- "is_table": false,
270
- "fields": [
271
- {
272
- "name": "result",
273
- "type": {
274
- "name": "bool",
275
- "is_array": false,
276
- "metadata": [0, 0]
277
- }
278
- }
279
- ]
280
- },
281
- "annotations": null
282
- },
283
- {
284
- "name": "get_dbid",
285
- "parameters": [
286
- {
287
- "name": "$data_provider",
288
- "type": {
289
- "name": "text",
290
- "is_array": false,
291
- "metadata": [0, 0]
292
- }
293
- },
294
- {
295
- "name": "$stream_id",
296
- "type": {
297
- "name": "text",
298
- "is_array": false,
299
- "metadata": [0, 0]
300
- }
301
- }
302
- ],
303
- "public": false,
304
- "modifiers": ["VIEW"],
305
- "body": "$starts_with_0x bool := false;\n for $row in SELECT $data_provider LIKE '0x%' as a {\n $starts_with_0x := $row.a;\n }\n\n $data_provider_without_0x text;\n\n if $starts_with_0x == true {\n $data_provider_without_0x := substring($data_provider, 3);\n } else {\n $data_provider_without_0x := $data_provider;\n }\n\n return generate_dbid($stream_id, decode($data_provider_without_0x, 'hex'));",
306
- "return_types": {
307
- "is_table": false,
308
- "fields": [
309
- {
310
- "name": "result",
311
- "type": {
312
- "name": "text",
313
- "is_array": false,
314
- "metadata": [0, 0]
315
- }
316
- }
317
- ]
318
- },
319
- "annotations": null
320
- },
321
- {
322
- "name": "get_raw_record",
323
- "parameters": [
324
- {
325
- "name": "$date_from",
326
- "type": {
327
- "name": "text",
328
- "is_array": false,
329
- "metadata": [0, 0]
330
- }
331
- },
332
- {
333
- "name": "$date_to",
334
- "type": {
335
- "name": "text",
336
- "is_array": false,
337
- "metadata": [0, 0]
338
- }
339
- },
340
- {
341
- "name": "$frozen_at",
342
- "type": {
343
- "name": "int",
344
- "is_array": false,
345
- "metadata": [0, 0]
346
- }
347
- },
348
- {
349
- "name": "$child_data_providers",
350
- "type": {
351
- "name": "text",
352
- "is_array": true,
353
- "metadata": [0, 0]
354
- }
355
- },
356
- {
357
- "name": "$child_stream_ids",
358
- "type": {
359
- "name": "text",
360
- "is_array": true,
361
- "metadata": [0, 0]
362
- }
363
- }
364
- ],
365
- "public": false,
366
- "modifiers": ["VIEW"],
367
- "body": "if is_wallet_allowed_to_read(@caller) == false {\n error('wallet not allowed to read');\n }\n // check if the stream is allowed to compose\n is_stream_allowed_to_compose(@foreign_caller);\n\n // check if the child_data_providers and child_stream_id are the same length\n if array_length($child_data_providers) != array_length($child_stream_ids) {\n error('child_data_providers and child_stream_id must be the same length');\n }\n\n if array_length($child_data_providers) \u003e 0 {\n // arrays are 1-indexed, so we match that\n for $taxonomy_index in 1..array_length($child_data_providers) {\n $dbid text := get_dbid($child_data_providers[$taxonomy_index], $child_stream_ids[$taxonomy_index]);\n for $row3 in SELECT * FROM ext_get_record[$dbid, 'get_record']($date_from, $date_to, $frozen_at) {\n return next $row3.date_value, $row3.value, $taxonomy_index;\n }\n }\n }",
368
- "return_types": {
369
- "is_table": true,
370
- "fields": [
371
- {
372
- "name": "date_value",
373
- "type": {
374
- "name": "text",
375
- "is_array": false,
376
- "metadata": [0, 0]
377
- }
378
- },
379
- {
380
- "name": "value",
381
- "type": {
382
- "name": "decimal",
383
- "is_array": false,
384
- "metadata": [36, 18]
385
- }
386
- },
387
- {
388
- "name": "taxonomy_index",
389
- "type": {
390
- "name": "int",
391
- "is_array": false,
392
- "metadata": [0, 0]
393
- }
394
- }
395
- ]
396
- },
397
- "annotations": null
398
- },
399
- {
400
- "name": "get_raw_index",
401
- "parameters": [
402
- {
403
- "name": "$date_from",
404
- "type": {
405
- "name": "text",
406
- "is_array": false,
407
- "metadata": [0, 0]
408
- }
409
- },
410
- {
411
- "name": "$date_to",
412
- "type": {
413
- "name": "text",
414
- "is_array": false,
415
- "metadata": [0, 0]
416
- }
417
- },
418
- {
419
- "name": "$frozen_at",
420
- "type": {
421
- "name": "int",
422
- "is_array": false,
423
- "metadata": [0, 0]
424
- }
425
- },
426
- {
427
- "name": "$child_data_providers",
428
- "type": {
429
- "name": "text",
430
- "is_array": true,
431
- "metadata": [0, 0]
432
- }
433
- },
434
- {
435
- "name": "$child_stream_ids",
436
- "type": {
437
- "name": "text",
438
- "is_array": true,
439
- "metadata": [0, 0]
440
- }
441
- },
442
- {
443
- "name": "$base_date",
444
- "type": {
445
- "name": "text",
446
- "is_array": false,
447
- "metadata": [0, 0]
448
- }
449
- }
450
- ],
451
- "public": false,
452
- "modifiers": ["VIEW"],
453
- "body": "if is_wallet_allowed_to_read(@caller) == false {\n error('wallet not allowed to read');\n }\n // check if the stream is allowed to compose\n is_stream_allowed_to_compose(@foreign_caller);\n\n // check if the child_data_providers and child_stream_id are the same length\n if array_length($child_data_providers) != array_length($child_stream_ids) {\n error('child_data_providers and child_stream_id must be the same length');\n }\n\n if array_length($child_data_providers) \u003e 0 {\n // arrays are 1-indexed, so we match that\n for $taxonomy_index in 1..array_length($child_data_providers) {\n $dbid text := get_dbid($child_data_providers[$taxonomy_index], $child_stream_ids[$taxonomy_index]);\n for $row in SELECT * FROM ext_get_index[$dbid, 'get_index']($date_from, $date_to, $frozen_at, $base_date) {\n return next $row.date_value, $row.value, $taxonomy_index;\n }\n }\n }",
454
- "return_types": {
455
- "is_table": true,
456
- "fields": [
457
- {
458
- "name": "date_value",
459
- "type": {
460
- "name": "text",
461
- "is_array": false,
462
- "metadata": [0, 0]
463
- }
464
- },
465
- {
466
- "name": "value",
467
- "type": {
468
- "name": "decimal",
469
- "is_array": false,
470
- "metadata": [36, 18]
471
- }
472
- },
473
- {
474
- "name": "taxonomy_index",
475
- "type": {
476
- "name": "int",
477
- "is_array": false,
478
- "metadata": [0, 0]
479
- }
480
- }
481
- ]
482
- },
483
- "annotations": null
484
- },
485
- {
486
- "name": "get_record_filled",
487
- "parameters": [
488
- {
489
- "name": "$date_from",
490
- "type": {
491
- "name": "text",
492
- "is_array": false,
493
- "metadata": [0, 0]
494
- }
495
- },
496
- {
497
- "name": "$date_to",
498
- "type": {
499
- "name": "text",
500
- "is_array": false,
501
- "metadata": [0, 0]
502
- }
503
- },
504
- {
505
- "name": "$frozen_at",
506
- "type": {
507
- "name": "int",
508
- "is_array": false,
509
- "metadata": [0, 0]
510
- }
511
- }
512
- ],
513
- "public": false,
514
- "modifiers": ["VIEW"],
515
- "body": "$base_taxonomy_list int[];\n\n // Initialize taxonomy variables\n $taxonomy_count int := 0;\n $last_values decimal(36,18)[];\n $child_data_providers text[];\n $child_stream_id text[];\n\n // Fetch taxonomy details\n for $row in SELECT * FROM describe_taxonomies(true) {\n $taxonomy_count := $taxonomy_count + 1;\n $base_taxonomy_list := array_append($base_taxonomy_list, $taxonomy_count);\n $last_values := array_append($last_values, null::decimal(36,18));\n $child_data_providers := array_append($child_data_providers, $row.child_data_provider);\n $child_stream_id := array_append($child_stream_id, $row.child_stream_id);\n }\n\n $unemitted_taxonomies_for_date int[] := $base_taxonomy_list;\n $removed_elements_count int := 0;\n $prev_date text := '';\n $current_date text := '';\n\n // what could make this process easier:\n // - use a map to store the last values, so we can easily check if a value is null\n // - better manipulation of tables as objects, then we could modify a table to\n // fill forward without needing to return immediately on each loop\n\n // Fetch raw records and emit values with dynamic weights\n for $row_raw in SELECT * FROM get_raw_record($date_from, $date_to, $frozen_at, $child_data_providers, $child_stream_id) ORDER BY date_value, taxonomy_index {\n $current_date := $row_raw.date_value;\n\n // Fetch the dynamic weight based on the current date\n $dynamic_weight decimal(36,18) := get_dynamic_weight($child_stream_id[$row_raw.taxonomy_index], $current_date);\n\n // Emit filled values for previous date if date has changed\n if $current_date != $prev_date {\n if $prev_date is distinct from '' {\n for $unemitted_taxonomy in $unemitted_taxonomies_for_date {\n // TODO: remove this when we have slices or include if we have just index assignment\n // if $unemitted_taxonomy is distinct from null {\n\n if $last_values[$unemitted_taxonomy] is distinct from null {\n // Use the stored dynamic weight from the previous date\n $dynamic_weight_prev := get_dynamic_weight($child_stream_id[$unemitted_taxonomy], $prev_date);\n return next $prev_date, $last_values[$unemitted_taxonomy] * $dynamic_weight_prev, $dynamic_weight_prev;\n }\n }\n // Clear unemitted taxonomies for the new date\n $unemitted_taxonomies_for_date := $base_taxonomy_list;\n $removed_elements_count := 0;\n }\n }\n\n // TODO: uncomment when we have index assignment\n // $last_values[$row_raw.taxonomy_index] := $row_raw.value;\n\n // Update the last values for the current date\n $last_values := array_update_element($last_values, $row_raw.taxonomy_index, $row_raw.value);\n\n // Emit current value with the dynamic weight\n return next $current_date, $row_raw.value * $dynamic_weight, $dynamic_weight;\n\n // Remove emitted taxonomy from the unemitted list\n // we need to subtract the removed_elements_count because the array is shrinking\n // TODO: we can improve it when we either can remove elements, or with array element assignment\n $unemitted_taxonomies_for_date := remove_array_element($unemitted_taxonomies_for_date, $row_raw.taxonomy_index - $removed_elements_count);\n $removed_elements_count := $removed_elements_count + 1;\n // remove elements is not performant without slices. Then let's make the elements null for now\n // $unemitted_taxonomies_for_date[$row_raw.taxonomy_index] := null;\n\n $prev_date := $current_date;\n }\n\n // Emit filled values for the last date\n if $prev_date is distinct from '' {\n if $taxonomy_count \u003e 0 {\n for $unemitted_taxonomy2 in $unemitted_taxonomies_for_date {\n if $last_values[$unemitted_taxonomy2] is distinct from null {\n // Fetch the correct dynamic weight for the last date\n $dynamic_weight_last := get_dynamic_weight($child_stream_id[$unemitted_taxonomy2], $prev_date);\n return next $prev_date, $last_values[$unemitted_taxonomy2] * $dynamic_weight_last, $dynamic_weight_last;\n }\n }\n }\n }",
516
- "return_types": {
517
- "is_table": true,
518
- "fields": [
519
- {
520
- "name": "date_value",
521
- "type": {
522
- "name": "text",
523
- "is_array": false,
524
- "metadata": [0, 0]
525
- }
526
- },
527
- {
528
- "name": "value_with_weight",
529
- "type": {
530
- "name": "decimal",
531
- "is_array": false,
532
- "metadata": [36, 18]
533
- }
534
- },
535
- {
536
- "name": "weight",
537
- "type": {
538
- "name": "decimal",
539
- "is_array": false,
540
- "metadata": [36, 18]
541
- }
542
- }
543
- ]
544
- },
545
- "annotations": null
546
- },
547
- {
548
- "name": "get_index_filled",
549
- "parameters": [
550
- {
551
- "name": "$date_from",
552
- "type": {
553
- "name": "text",
554
- "is_array": false,
555
- "metadata": [0, 0]
556
- }
557
- },
558
- {
559
- "name": "$date_to",
560
- "type": {
561
- "name": "text",
562
- "is_array": false,
563
- "metadata": [0, 0]
564
- }
565
- },
566
- {
567
- "name": "$frozen_at",
568
- "type": {
569
- "name": "int",
570
- "is_array": false,
571
- "metadata": [0, 0]
572
- }
573
- },
574
- {
575
- "name": "$base_date",
576
- "type": {
577
- "name": "text",
578
- "is_array": false,
579
- "metadata": [0, 0]
580
- }
581
- }
582
- ],
583
- "public": false,
584
- "modifiers": ["VIEW"],
585
- "body": "$base_taxonomy_list int[];\n\n // Initialize taxonomy variables\n $taxonomy_count int := 0;\n $last_values decimal(36,18)[];\n $child_data_providers text[];\n $child_stream_id text[];\n\n // Fetch taxonomy details\n for $row in SELECT * FROM describe_taxonomies(true) {\n $taxonomy_count := $taxonomy_count + 1;\n $base_taxonomy_list := array_append($base_taxonomy_list, $taxonomy_count);\n $last_values := array_append($last_values, null::decimal(36,18));\n $child_data_providers := array_append($child_data_providers, $row.child_data_provider);\n $child_stream_id := array_append($child_stream_id, $row.child_stream_id);\n }\n\n $unemitted_taxonomies_for_date int[] := $base_taxonomy_list;\n $removed_elements_count int := 0;\n $prev_date text := '';\n $current_date text := '';\n\n // what could make this process easier:\n // - use a map to store the last values, so we can easily check if a value is null\n // - better manipulation of tables as objects, then we could modify a table to\n // fill forward without needing to return immediately on each loop\n\n for $row_raw in SELECT * FROM get_raw_index($date_from, $date_to, $frozen_at, $child_data_providers, $child_stream_id, $base_date) ORDER BY date_value, taxonomy_index {\n $current_date := $row_raw.date_value;\n\n // Fetch the dynamic weight based on the current date\n $dynamic_weight decimal(36,18) := get_dynamic_weight($child_stream_id[$row_raw.taxonomy_index], $current_date);\n\n // Emit filled values for the previous date if the date has changed\n if $current_date != $prev_date {\n if $prev_date is distinct from '' {\n for $unemitted_taxonomy in $unemitted_taxonomies_for_date {\n if $last_values[$unemitted_taxonomy] is distinct from null {\n // TODO: remove this when we have slices or include if we have just index assignment\n // if $unemitted_taxonomy is distinct from null {\n\n // Use the stored dynamic weight from the previous date\n $dynamic_weight_prev := get_dynamic_weight($child_stream_id[$unemitted_taxonomy], $prev_date);\n return next $prev_date, $last_values[$unemitted_taxonomy] * $dynamic_weight_prev, $dynamic_weight_prev;\n }\n }\n }\n // Clear unemitted taxonomies for the new date\n $unemitted_taxonomies_for_date := $base_taxonomy_list;\n $removed_elements_count := 0;\n }\n\n // TODO: uncomment when we have index assignment\n // $last_values[$row_raw.taxonomy_index] := $row_raw.value;\n\n // Update the last values for the current date\n $last_values := array_update_element($last_values, $row_raw.taxonomy_index, $row_raw.value);\n\n // Emit the current value with the dynamic weight\n return next $current_date, $row_raw.value * $dynamic_weight, $dynamic_weight;\n\n // Remove emitted taxonomy from the unemitted list\n // TODO: we can improve it when we either can remove elements, or with array element assignment\n $unemitted_taxonomies_for_date := remove_array_element($unemitted_taxonomies_for_date, $row_raw.taxonomy_index - $removed_elements_count);\n $removed_elements_count := $removed_elements_count + 1;\n\n // remove elements is not performant without slices. Then let's make the elements null for now\n // $unemitted_taxonomies_for_date[$row_raw.taxonomy_index] := null;\n\n $prev_date := $current_date;\n }\n\n // Emit filled values for the last date\n if $prev_date is distinct from '' {\n if $taxonomy_count \u003e 0 {\n for $unemitted_taxonomy2 in $unemitted_taxonomies_for_date {\n if $last_values[$unemitted_taxonomy2] is distinct from null {\n // Fetch the correct dynamic weight for the last date\n $dynamic_weight_last := get_dynamic_weight($child_stream_id[$unemitted_taxonomy2], $prev_date);\n return next $prev_date, $last_values[$unemitted_taxonomy2] * $dynamic_weight_last, $dynamic_weight_last;\n }\n }\n }\n }",
586
- "return_types": {
587
- "is_table": true,
588
- "fields": [
589
- {
590
- "name": "date_value",
591
- "type": {
592
- "name": "text",
593
- "is_array": false,
594
- "metadata": [0, 0]
595
- }
596
- },
597
- {
598
- "name": "value_with_weight",
599
- "type": {
600
- "name": "decimal",
601
- "is_array": false,
602
- "metadata": [36, 18]
603
- }
604
- },
605
- {
606
- "name": "weight",
607
- "type": {
608
- "name": "decimal",
609
- "is_array": false,
610
- "metadata": [36, 18]
611
- }
612
- }
613
- ]
614
- },
615
- "annotations": null
616
- },
617
- {
618
- "name": "get_record",
619
- "parameters": [
620
- {
621
- "name": "$date_from",
622
- "type": {
623
- "name": "text",
624
- "is_array": false,
625
- "metadata": [0, 0]
626
- }
627
- },
628
- {
629
- "name": "$date_to",
630
- "type": {
631
- "name": "text",
632
- "is_array": false,
633
- "metadata": [0, 0]
634
- }
635
- },
636
- {
637
- "name": "$frozen_at",
638
- "type": {
639
- "name": "int",
640
- "is_array": false,
641
- "metadata": [0, 0]
642
- }
643
- }
644
- ],
645
- "public": true,
646
- "modifiers": ["VIEW"],
647
- "body": "$in_range bool := false;\n $last_date text;\n $last_value decimal(36,18);\n // here, we sum all of the records that were found by aggregating on the date_valie\n for $row in SELECT date_value, total_value_with_weight / total_weight as value FROM\n (SELECT\n date_value,\n SUM(value_with_weight)::decimal(36,18) AS total_value_with_weight,\n SUM(weight)::decimal(36,18) AS total_weight\n FROM get_record_filled($date_from, $date_to, $frozen_at) group by date_value) as r {\n // when we arrive in the range, we start emitting. If there was a previous value, we emit it\n if $in_range == false {\n if $row.date_value \u003e= $date_from {\n $in_range := true;\n if ($last_date is distinct from null) AND $row.date_value != $date_from {\n return next $last_date, $last_value;\n }\n }\n\n $last_date := $row.date_value;\n $last_value := $row.value;\n }\n // we check again, because it might just have entered the range\n if $in_range == true {\n return next $row.date_value, $row.value;\n }\n }\n\n // if we finished the loop and we never entered the range, we emit the last value\n if $in_range == false AND $last_date is distinct from null {\n return next $last_date, $last_value;\n }",
648
- "return_types": {
649
- "is_table": true,
650
- "fields": [
651
- {
652
- "name": "date_value",
653
- "type": {
654
- "name": "text",
655
- "is_array": false,
656
- "metadata": [0, 0]
657
- }
658
- },
659
- {
660
- "name": "value",
661
- "type": {
662
- "name": "decimal",
663
- "is_array": false,
664
- "metadata": [36, 18]
665
- }
666
- }
667
- ]
668
- },
669
- "annotations": null
670
- },
671
- {
672
- "name": "get_index",
673
- "parameters": [
674
- {
675
- "name": "$date_from",
676
- "type": {
677
- "name": "text",
678
- "is_array": false,
679
- "metadata": [0, 0]
680
- }
681
- },
682
- {
683
- "name": "$date_to",
684
- "type": {
685
- "name": "text",
686
- "is_array": false,
687
- "metadata": [0, 0]
688
- }
689
- },
690
- {
691
- "name": "$frozen_at",
692
- "type": {
693
- "name": "int",
694
- "is_array": false,
695
- "metadata": [0, 0]
696
- }
697
- },
698
- {
699
- "name": "$base_date",
700
- "type": {
701
- "name": "text",
702
- "is_array": false,
703
- "metadata": [0, 0]
704
- }
705
- }
706
- ],
707
- "public": true,
708
- "modifiers": ["VIEW"],
709
- "body": "$in_range bool := false;\n $last_date text;\n $last_value decimal(36,18);\n // here, we sum all of the indexes that were found by aggregating on the date_value\n for $row in SELECT date_value, total_value_with_weight / total_weight as value FROM\n (SELECT\n date_value,\n SUM(value_with_weight)::decimal(36,18) AS total_value_with_weight,\n SUM(weight)::decimal(36,18) AS total_weight\n FROM get_index_filled($date_from, $date_to, $frozen_at, $base_date) group by date_value) as r {\n // when we arrive in the range, we start emitting. If there was a previous value, we emit it\n if $in_range == false {\n if $row.date_value \u003e= $date_from {\n $in_range := true;\n if ($last_date is distinct from null) AND $row.date_value != $date_from {\n return next $last_date, $last_value;\n }\n }\n\n $last_date := $row.date_value;\n $last_value := $row.value;\n }\n // we check again, because it might just have entered the range\n if $in_range == true {\n return next $row.date_value, $row.value;\n }\n }\n\n // if we finished the loop and we never entered the range, we emit the last value\n if $in_range == false AND $last_date is distinct from null {\n return next $last_date, $last_value;\n }",
710
- "return_types": {
711
- "is_table": true,
712
- "fields": [
713
- {
714
- "name": "date_value",
715
- "type": {
716
- "name": "text",
717
- "is_array": false,
718
- "metadata": [0, 0]
719
- }
720
- },
721
- {
722
- "name": "value",
723
- "type": {
724
- "name": "decimal",
725
- "is_array": false,
726
- "metadata": [36, 18]
727
- }
728
- }
729
- ]
730
- },
731
- "annotations": null
732
- },
733
- {
734
- "name": "get_first_record",
735
- "parameters": [
736
- {
737
- "name": "$after_date",
738
- "type": {
739
- "name": "text",
740
- "is_array": false,
741
- "metadata": [0, 0]
742
- }
743
- },
744
- {
745
- "name": "$frozen_at",
746
- "type": {
747
- "name": "int",
748
- "is_array": false,
749
- "metadata": [0, 0]
750
- }
751
- }
752
- ],
753
- "public": true,
754
- "modifiers": ["VIEW"],
755
- "body": "if is_wallet_allowed_to_read(@caller) == false {\n error('wallet not allowed to read');\n }\n\n // check compose access\n is_stream_allowed_to_compose(@foreign_caller);\n\n // let's coalesce null with ''\n // then, if it's empty, it will always be the first value\n if $after_date is null {\n $after_date := '';\n }\n\n // 1. figure the earliest date possible after the after_date\n $earliest_date text := '';\n for $taxonomy_row in SELECT * FROM describe_taxonomies(true) {\n $dbid := get_dbid($taxonomy_row.child_data_provider, $taxonomy_row.child_stream_id);\n for $record_row in SELECT * FROM ext_get_first_record[$dbid, 'get_first_record']($after_date, $frozen_at) {\n if $earliest_date == '' OR $record_row.date_value \u003c $earliest_date {\n $earliest_date := $record_row.date_value;\n }\n }\n }\n\n // 2. get_record with the earliest date if it exists\n if $earliest_date != '' {\n for $row in SELECT date_value, value FROM get_record($earliest_date, $earliest_date, $frozen_at) {\n return next $row.date_value, $row.value;\n }\n }",
756
- "return_types": {
757
- "is_table": true,
758
- "fields": [
759
- {
760
- "name": "date_value",
761
- "type": {
762
- "name": "text",
763
- "is_array": false,
764
- "metadata": [0, 0]
765
- }
766
- },
767
- {
768
- "name": "value",
769
- "type": {
770
- "name": "decimal",
771
- "is_array": false,
772
- "metadata": [36, 18]
773
- }
774
- }
775
- ]
776
- },
777
- "annotations": null
778
- },
779
- {
780
- "name": "is_initiated",
781
- "parameters": null,
782
- "public": false,
783
- "modifiers": ["VIEW"],
784
- "body": "for $row in SELECT * FROM metadata WHERE metadata_key = 'type' LIMIT 1 {\n return true;\n }\n\n return false;",
785
- "return_types": {
786
- "is_table": false,
787
- "fields": [
788
- {
789
- "name": "result",
790
- "type": {
791
- "name": "bool",
792
- "is_array": false,
793
- "metadata": [0, 0]
794
- }
795
- }
796
- ]
797
- },
798
- "annotations": null
799
- },
800
- {
801
- "name": "is_stream_owner",
802
- "parameters": [
803
- {
804
- "name": "$wallet",
805
- "type": {
806
- "name": "text",
807
- "is_array": false,
808
- "metadata": [0, 0]
809
- }
810
- }
811
- ],
812
- "public": true,
813
- "modifiers": ["VIEW"],
814
- "body": "for $row in SELECT * FROM metadata WHERE metadata_key = 'stream_owner' AND value_ref = LOWER($wallet) LIMIT 1 {\n return true;\n }\n return false;",
815
- "return_types": {
816
- "is_table": false,
817
- "fields": [
818
- {
819
- "name": "result",
820
- "type": {
821
- "name": "bool",
822
- "is_array": false,
823
- "metadata": [0, 0]
824
- }
825
- }
826
- ]
827
- },
828
- "annotations": null
829
- },
830
- {
831
- "name": "is_wallet_allowed_to_read",
832
- "parameters": [
833
- {
834
- "name": "$wallet",
835
- "type": {
836
- "name": "text",
837
- "is_array": false,
838
- "metadata": [0, 0]
839
- }
840
- }
841
- ],
842
- "public": true,
843
- "modifiers": ["VIEW"],
844
- "body": "$visibility int := 0;\n for $v_row in SELECT * FROM get_metadata('read_visibility', true, null) {\n $visibility := $v_row.value_i;\n }\n\n if $visibility == 0 {\n return true;\n }\n\n // if it's the owner, it's permitted\n if is_stream_owner($wallet) {\n return true;\n }\n\n // if there's metadata allow_read_wallet -\u003e \u003cwallet\u003e, then its permitted\n for $row in SELECT * FROM get_metadata('allow_read_wallet', false, $wallet) {\n return true;\n }\n\n return false;",
845
- "return_types": {
846
- "is_table": false,
847
- "fields": [
848
- {
849
- "name": "value",
850
- "type": {
851
- "name": "bool",
852
- "is_array": false,
853
- "metadata": [0, 0]
854
- }
855
- }
856
- ]
857
- },
858
- "annotations": null
859
- },
860
- {
861
- "name": "stream_owner_only",
862
- "parameters": null,
863
- "public": false,
864
- "modifiers": ["VIEW"],
865
- "body": "if is_stream_owner(@caller) == false {\n error('Stream owner only procedure');\n }",
866
- "return_types": null,
867
- "annotations": null
868
- },
869
- {
870
- "name": "init",
871
- "parameters": null,
872
- "public": true,
873
- "modifiers": ["OWNER"],
874
- "body": "if is_initiated() {\n error('this contract was already initialized');\n }\n\n // check if caller is empty\n // this happens can happen in tests, but we should also protect for that on production\n if @caller == '' {\n error('caller is empty');\n }\n\n $current_block int := @height;\n\n // uuid's namespaces are any random generated uuid from https://www.uuidtools.com/v5\n // but each usage should be different to maintain determinism, so we reuse the previous result\n $current_uuid uuid := uuid_generate_v5('41fea9f0-179f-11ef-8838-325096b39f47'::uuid, @txid);\n\n // type = composed\n $current_uuid := uuid_generate_v5($current_uuid, @txid);\n INSERT INTO metadata (row_id, metadata_key, value_s, created_at)\n VALUES ($current_uuid, 'type', 'composed', $current_block);\n\n // stream_owner = @caller\n $current_uuid := uuid_generate_v5($current_uuid, @txid);\n INSERT INTO metadata (row_id, metadata_key, value_ref, created_at)\n VALUES ($current_uuid, 'stream_owner', LOWER(@caller), 1);\n\n // compose_visibility = 0 (public)\n $current_uuid := uuid_generate_v5($current_uuid, @txid);\n INSERT INTO metadata (row_id, metadata_key, value_i, created_at)\n VALUES ($current_uuid, 'compose_visibility', 0, $current_block);\n\n // read_visibility = 0 (public)\n $current_uuid := uuid_generate_v5($current_uuid, @txid);\n INSERT INTO metadata (row_id, metadata_key, value_i, created_at)\n VALUES ($current_uuid, 'read_visibility', 0, $current_block);\n\n $readonly_keys text[] := [\n 'type',\n 'stream_owner',\n 'readonly_key',\n 'taxonomy_version'\n ];\n\n for $key in $readonly_keys {\n $current_uuid := uuid_generate_v5($current_uuid, @txid);\n INSERT INTO metadata (row_id, metadata_key, value_s, created_at)\n VALUES ($current_uuid, 'readonly_key', $key, $current_block);\n }",
875
- "return_types": null,
876
- "annotations": null
877
- },
878
- {
879
- "name": "insert_metadata",
880
- "parameters": [
881
- {
882
- "name": "$key",
883
- "type": {
884
- "name": "text",
885
- "is_array": false,
886
- "metadata": [0, 0]
887
- }
888
- },
889
- {
890
- "name": "$value",
891
- "type": {
892
- "name": "text",
893
- "is_array": false,
894
- "metadata": [0, 0]
895
- }
896
- },
897
- {
898
- "name": "$val_type",
899
- "type": {
900
- "name": "text",
901
- "is_array": false,
902
- "metadata": [0, 0]
903
- }
904
- }
905
- ],
906
- "public": true,
907
- "modifiers": null,
908
- "body": "$value_i int;\n $value_s text;\n $value_f decimal(36,18);\n $value_b bool;\n $value_ref text;\n\n if $val_type == 'int' {\n $value_i := $value::int;\n } elseif $val_type == 'string' {\n $value_s := $value;\n } elseif $val_type == 'bool' {\n $value_b := $value::bool;\n } elseif $val_type == 'ref' {\n $value_ref := $value;\n } elseif $val_type == 'float' {\n $value_f := $value::decimal(36,18);\n } else {\n error(format('unknown type used \"%s\". valid types = \"float\" | \"bool\" | \"int\" | \"ref\" | \"string\"', $val_type));\n }\n\n stream_owner_only();\n\n if is_initiated() == false {\n error('contract must be initiated');\n }\n\n // check if it's read-only\n for $row in SELECT * FROM metadata WHERE metadata_key = 'readonly_key' AND value_s = $key LIMIT 1 {\n error('Cannot insert metadata for read-only key');\n }\n\n // we create one deterministic uuid for each metadata record\n // we can't use just @txid because a single transaction can insert multiple metadata records.\n // the result will be idempotency here too.\n $uuid_key := @txid || $key || $value;\n\n $uuid uuid := uuid_generate_v5('1361df5d-0230-47b3-b2c1-37950cf51fe9'::uuid, $uuid_key);\n $current_block int := @height;\n\n // insert data\n INSERT INTO metadata (row_id, metadata_key, value_i, value_f, value_s, value_b, value_ref, created_at)\n VALUES ($uuid, $key, $value_i, $value_f, $value_s, $value_b, LOWER($value_ref), $current_block);",
909
- "return_types": null,
910
- "annotations": null
911
- },
912
- {
913
- "name": "get_metadata",
914
- "parameters": [
915
- {
916
- "name": "$key",
917
- "type": {
918
- "name": "text",
919
- "is_array": false,
920
- "metadata": [0, 0]
921
- }
922
- },
923
- {
924
- "name": "$only_latest",
925
- "type": {
926
- "name": "bool",
927
- "is_array": false,
928
- "metadata": [0, 0]
929
- }
930
- },
931
- {
932
- "name": "$ref",
933
- "type": {
934
- "name": "text",
935
- "is_array": false,
936
- "metadata": [0, 0]
937
- }
938
- }
939
- ],
940
- "public": true,
941
- "modifiers": ["VIEW"],
942
- "body": "if $only_latest == true {\n if $ref is distinct from null {\n return SELECT\n row_id,\n null::int as value_i,\n null::decimal(36,18) as value_f,\n null::bool as value_b,\n null::text as value_s,\n value_ref,\n created_at\n FROM metadata\n WHERE metadata_key = $key AND disabled_at IS NULL AND value_ref = LOWER($ref)\n ORDER BY created_at DESC\n LIMIT 1;\n } else {\n return SELECT\n row_id,\n value_i,\n value_f,\n value_b,\n value_s,\n value_ref,\n created_at\n FROM metadata\n WHERE metadata_key = $key AND disabled_at IS NULL\n ORDER BY created_at DESC\n LIMIT 1;\n }\n } else {\n // SHOULD BE THE EXACT CODE AS ABOVE, BUT WITHOUT LIMIT\n if $ref is distinct from null {\n return SELECT\n row_id,\n null::int as value_i,\n null::decimal(36,18) as value_f,\n null::bool as value_b,\n null::text as value_s,\n value_ref,\n created_at\n FROM metadata\n WHERE metadata_key = $key AND disabled_at IS NULL AND value_ref = LOWER($ref)\n ORDER BY created_at DESC;\n } else {\n return SELECT\n row_id,\n value_i,\n value_f,\n value_b,\n value_s,\n value_ref,\n created_at\n FROM metadata\n WHERE metadata_key = $key AND disabled_at IS NULL\n ORDER BY created_at DESC;\n }\n }",
943
- "return_types": {
944
- "is_table": true,
945
- "fields": [
946
- {
947
- "name": "row_id",
948
- "type": {
949
- "name": "uuid",
950
- "is_array": false,
951
- "metadata": [0, 0]
952
- }
953
- },
954
- {
955
- "name": "value_i",
956
- "type": {
957
- "name": "int",
958
- "is_array": false,
959
- "metadata": [0, 0]
960
- }
961
- },
962
- {
963
- "name": "value_f",
964
- "type": {
965
- "name": "decimal",
966
- "is_array": false,
967
- "metadata": [36, 18]
968
- }
969
- },
970
- {
971
- "name": "value_b",
972
- "type": {
973
- "name": "bool",
974
- "is_array": false,
975
- "metadata": [0, 0]
976
- }
977
- },
978
- {
979
- "name": "value_s",
980
- "type": {
981
- "name": "text",
982
- "is_array": false,
983
- "metadata": [0, 0]
984
- }
985
- },
986
- {
987
- "name": "value_ref",
988
- "type": {
989
- "name": "text",
990
- "is_array": false,
991
- "metadata": [0, 0]
992
- }
993
- },
994
- {
995
- "name": "created_at",
996
- "type": {
997
- "name": "int",
998
- "is_array": false,
999
- "metadata": [0, 0]
1000
- }
1001
- }
1002
- ]
1003
- },
1004
- "annotations": null
1005
- },
1006
- {
1007
- "name": "disable_metadata",
1008
- "parameters": [
1009
- {
1010
- "name": "$row_id",
1011
- "type": {
1012
- "name": "uuid",
1013
- "is_array": false,
1014
- "metadata": [0, 0]
1015
- }
1016
- }
1017
- ],
1018
- "public": true,
1019
- "modifiers": null,
1020
- "body": "stream_owner_only();\n\n $current_block int := @height;\n\n $found bool := false;\n\n // Check if the metadata is not read-only\n for $metadata_row in\n SELECT metadata_key\n FROM metadata\n WHERE row_id = $row_id AND disabled_at IS NULL\n LIMIT 1 {\n $found := true;\n $row_key text := $metadata_row.metadata_key;\n\n for $readonly_row in SELECT row_id FROM metadata WHERE metadata_key = 'readonly_key' AND value_s = $row_key LIMIT 1 {\n error('Cannot disable read-only metadata');\n }\n\n UPDATE metadata SET disabled_at = $current_block\n WHERE row_id = $row_id;\n }\n\n if $found == false {\n error('metadata record not found');\n }",
1021
- "return_types": null,
1022
- "annotations": null
1023
- },
1024
- {
1025
- "name": "transfer_stream_ownership",
1026
- "parameters": [
1027
- {
1028
- "name": "$new_owner",
1029
- "type": {
1030
- "name": "text",
1031
- "is_array": false,
1032
- "metadata": [0, 0]
1033
- }
1034
- }
1035
- ],
1036
- "public": true,
1037
- "modifiers": null,
1038
- "body": "stream_owner_only();\n\n // fail if not a valid address\n check_eth_address($new_owner);\n\n UPDATE metadata SET value_ref = LOWER($new_owner)\n WHERE metadata_key = 'stream_owner';",
1039
- "return_types": null,
1040
- "annotations": null
1041
- },
1042
- {
1043
- "name": "check_eth_address",
1044
- "parameters": [
1045
- {
1046
- "name": "$address",
1047
- "type": {
1048
- "name": "text",
1049
- "is_array": false,
1050
- "metadata": [0, 0]
1051
- }
1052
- }
1053
- ],
1054
- "public": false,
1055
- "modifiers": null,
1056
- "body": "if (length($address) != 42) {\n error('invalid address length');\n }\n\n // check if starts with 0x\n for $row in SELECT $address LIKE '0x%' as a {\n if $row.a == false {\n error('address does not start with 0x');\n }\n }",
1057
- "return_types": null,
1058
- "annotations": null
1059
- },
1060
- {
1061
- "name": "get_current_version",
1062
- "parameters": [
1063
- {
1064
- "name": "$show_disabled",
1065
- "type": {
1066
- "name": "bool",
1067
- "is_array": false,
1068
- "metadata": [0, 0]
1069
- }
1070
- }
1071
- ],
1072
- "public": false,
1073
- "modifiers": ["VIEW"],
1074
- "body": "if $show_disabled == false {\n for $row in SELECT version FROM taxonomies WHERE disabled_at IS NULL ORDER BY version DESC LIMIT 1 {\n return $row.version;\n }\n } else {\n for $row2 in SELECT version FROM taxonomies ORDER BY version DESC LIMIT 1 {\n return $row2.version;\n }\n }\n\n return 0;",
1075
- "return_types": {
1076
- "is_table": false,
1077
- "fields": [
1078
- {
1079
- "name": "result",
1080
- "type": {
1081
- "name": "int",
1082
- "is_array": false,
1083
- "metadata": [0, 0]
1084
- }
1085
- }
1086
- ]
1087
- },
1088
- "annotations": null
1089
- },
1090
- {
1091
- "name": "set_taxonomy",
1092
- "parameters": [
1093
- {
1094
- "name": "$data_providers",
1095
- "type": {
1096
- "name": "text",
1097
- "is_array": true,
1098
- "metadata": [0, 0]
1099
- }
1100
- },
1101
- {
1102
- "name": "$stream_ids",
1103
- "type": {
1104
- "name": "text",
1105
- "is_array": true,
1106
- "metadata": [0, 0]
1107
- }
1108
- },
1109
- {
1110
- "name": "$weights",
1111
- "type": {
1112
- "name": "decimal",
1113
- "is_array": true,
1114
- "metadata": [36, 18]
1115
- }
1116
- },
1117
- {
1118
- "name": "$start_date",
1119
- "type": {
1120
- "name": "text",
1121
- "is_array": false,
1122
- "metadata": [0, 0]
1123
- }
1124
- }
1125
- ],
1126
- "public": true,
1127
- "modifiers": null,
1128
- "body": "stream_owner_only();\n\n $next_version int := get_current_version(true) + 1;\n $block_height int := @height;\n $current_uuid uuid := uuid_generate_v5('e92064da-19c5-11ef-9bc0-325096b39f47'::uuid, @txid);\n\n $length int := array_length($data_providers);\n\n // check lengths\n if $length != array_length($stream_ids) {\n error('data_providers and stream_ids must have the same length');\n }\n if $length != array_length($weights) {\n error('data_providers and weights must have the same length');\n }\n\n for $i in 1..$length {\n $current_uuid := uuid_generate_v5($current_uuid, @txid);\n\n INSERT INTO taxonomies (taxonomy_id, child_stream_id, child_data_provider, weight, created_at, version, start_date)\n VALUES ($current_uuid, $stream_ids[$i], $data_providers[$i], $weights[$i], $block_height, $next_version, $start_date);\n }",
1129
- "return_types": null,
1130
- "annotations": null
1131
- },
1132
- {
1133
- "name": "describe_taxonomies",
1134
- "parameters": [
1135
- {
1136
- "name": "$latest_version",
1137
- "type": {
1138
- "name": "bool",
1139
- "is_array": false,
1140
- "metadata": [0, 0]
1141
- }
1142
- }
1143
- ],
1144
- "public": true,
1145
- "modifiers": ["VIEW"],
1146
- "body": "if $latest_version == true {\n // just the latest enabled version should be returned\n return SELECT\n child_stream_id,\n child_data_provider,\n weight,\n created_at,\n version,\n start_date\n FROM taxonomies\n WHERE version = get_current_version(false) AND disabled_at IS NULL\n ORDER BY created_at DESC;\n } else {\n return SELECT\n child_stream_id,\n child_data_provider,\n weight,\n created_at,\n version,\n start_date\n FROM taxonomies\n WHERE disabled_at IS NULL\n ORDER BY version DESC;\n }",
1147
- "return_types": {
1148
- "is_table": true,
1149
- "fields": [
1150
- {
1151
- "name": "child_stream_id",
1152
- "type": {
1153
- "name": "text",
1154
- "is_array": false,
1155
- "metadata": [0, 0]
1156
- }
1157
- },
1158
- {
1159
- "name": "child_data_provider",
1160
- "type": {
1161
- "name": "text",
1162
- "is_array": false,
1163
- "metadata": [0, 0]
1164
- }
1165
- },
1166
- {
1167
- "name": "weight",
1168
- "type": {
1169
- "name": "decimal",
1170
- "is_array": false,
1171
- "metadata": [36, 18]
1172
- }
1173
- },
1174
- {
1175
- "name": "created_at",
1176
- "type": {
1177
- "name": "int",
1178
- "is_array": false,
1179
- "metadata": [0, 0]
1180
- }
1181
- },
1182
- {
1183
- "name": "version",
1184
- "type": {
1185
- "name": "int",
1186
- "is_array": false,
1187
- "metadata": [0, 0]
1188
- }
1189
- },
1190
- {
1191
- "name": "start_date",
1192
- "type": {
1193
- "name": "text",
1194
- "is_array": false,
1195
- "metadata": [0, 0]
1196
- }
1197
- }
1198
- ]
1199
- },
1200
- "annotations": null
1201
- },
1202
- {
1203
- "name": "disable_taxonomy",
1204
- "parameters": [
1205
- {
1206
- "name": "$version",
1207
- "type": {
1208
- "name": "int",
1209
- "is_array": false,
1210
- "metadata": [0, 0]
1211
- }
1212
- }
1213
- ],
1214
- "public": true,
1215
- "modifiers": null,
1216
- "body": "stream_owner_only();\n\n $current_block int := @height;\n\n $found bool := false;\n\n // Check if the taxonomies with the given version exist and disable them\n for $row in SELECT child_stream_id FROM taxonomies WHERE version = $version AND disabled_at IS NULL {\n $found := true;\n UPDATE taxonomies SET disabled_at = $current_block\n WHERE version = $version AND disabled_at IS NULL;\n }\n\n if $found == false {\n error('No taxonomies found for the given version');\n }",
1217
- "return_types": null,
1218
- "annotations": null
1219
- },
1220
- {
1221
- "name": "is_stream_allowed_to_compose",
1222
- "parameters": [
1223
- {
1224
- "name": "$foreign_caller",
1225
- "type": {
1226
- "name": "text",
1227
- "is_array": false,
1228
- "metadata": [0, 0]
1229
- }
1230
- }
1231
- ],
1232
- "public": true,
1233
- "modifiers": ["VIEW"],
1234
- "body": "if $foreign_caller == '' {\n return true;\n }\n\n // if public, anyone can always read\n // If there's no visibility metadata, it's public.\n $visibility int := 0;\n for $v_row in SELECT * FROM get_metadata('compose_visibility', true, null) {\n $visibility := $v_row.value_i;\n }\n\n if $visibility == 0 {\n return true;\n }\n\n // if there's metadata allow_compose_stream -\u003e \u003cforeign_caller\u003e, then its permitted\n for $row in SELECT * FROM get_metadata('allow_compose_stream', true, $foreign_caller) LIMIT 1 {\n return true;\n }\n\n error('Stream not allowed to compose');",
1235
- "return_types": {
1236
- "is_table": false,
1237
- "fields": [
1238
- {
1239
- "name": "value",
1240
- "type": {
1241
- "name": "bool",
1242
- "is_array": false,
1243
- "metadata": [0, 0]
1244
- }
1245
- }
1246
- ]
1247
- },
1248
- "annotations": null
1249
- },
1250
- {
1251
- "name": "get_index_change",
1252
- "parameters": [
1253
- {
1254
- "name": "$date_from",
1255
- "type": {
1256
- "name": "text",
1257
- "is_array": false,
1258
- "metadata": [0, 0]
1259
- }
1260
- },
1261
- {
1262
- "name": "$date_to",
1263
- "type": {
1264
- "name": "text",
1265
- "is_array": false,
1266
- "metadata": [0, 0]
1267
- }
1268
- },
1269
- {
1270
- "name": "$frozen_at",
1271
- "type": {
1272
- "name": "int",
1273
- "is_array": false,
1274
- "metadata": [0, 0]
1275
- }
1276
- },
1277
- {
1278
- "name": "$base_date",
1279
- "type": {
1280
- "name": "text",
1281
- "is_array": false,
1282
- "metadata": [0, 0]
1283
- }
1284
- },
1285
- {
1286
- "name": "$days_interval",
1287
- "type": {
1288
- "name": "int",
1289
- "is_array": false,
1290
- "metadata": [0, 0]
1291
- }
1292
- }
1293
- ],
1294
- "public": true,
1295
- "modifiers": ["VIEW"],
1296
- "body": "if $frozen_at == null {\n $frozen_at := 0;\n }\n\n if $days_interval == null {\n error('days_interval is required');\n }\n\n $current_values decimal(36,18)[];\n // example: [01-2001, 05-2001, 09-2001, 10-2001]\n $current_dates text[];\n // example: [01-2000, 05-2000, 09-2000, 10-2000]\n $expected_prev_dates text[];\n\n for $row_current in SELECT * FROM get_index($date_from, $date_to, $frozen_at, $base_date) {\n $prev_date := format_unix_timestamp((parse_unix_timestamp($row_current.date_value, 'yyyy-MM-dd')::int - ($days_interval * 86400))::decimal(16,6), 'yyyy-MM-dd');\n $expected_prev_dates := array_append($expected_prev_dates, $prev_date);\n $current_values := array_append($current_values, $row_current.value);\n $current_dates := array_append($current_dates, $row_current.date_value);\n }\n\n // example: 01-2000]\n $earliest_prev_date := $expected_prev_dates[1];\n // example: 09-2000\n $latest_prev_date := $expected_prev_dates[array_length($expected_prev_dates)];\n\n // real previous values doesn't match the same length as expected previous dates\n // because the interval can have much more values than the expected dates\n $real_prev_values decimal(36,18)[];\n $real_prev_dates text[];\n\n // now we query the prev dates\n for $row_prev in SELECT * FROM get_index($earliest_prev_date, $latest_prev_date, $frozen_at, $base_date) {\n $real_prev_values := array_append($real_prev_values, $row_prev.value);\n $real_prev_dates := array_append($real_prev_dates, $row_prev.date_value);\n }\n\n // now we calculate the matching dates for the real prev values\n $result_prev_dates text[];\n $result_prev_values decimal(36,18)[];\n\n $real_prev_date_idx int := 1;\n\n // for each expected prev date, we find the matching real prev date\n if array_length($expected_prev_dates) \u003e 0 {\n for $expected_prev_date_idx in 1..array_length($expected_prev_dates) {\n // we start from the last index of real prev dates. we don't need to check previous values\n for $selector in $real_prev_date_idx..array_length($real_prev_dates) {\n // if next real prev date is greater than expected prev date (or null), then we need to use the current real value\n if $real_prev_dates[$selector + 1] \u003e $expected_prev_dates[$expected_prev_date_idx] OR $real_prev_dates[$selector + 1] IS NULL {\n // if the current real prev date is already greater than expected prev date\n // we use NULL. We're probably before the first real prev date here\n if $real_prev_dates[$selector] \u003e $expected_prev_dates[$expected_prev_date_idx] {\n $result_prev_dates := array_append($result_prev_dates, null::text);\n $result_prev_values := array_append($result_prev_values, null::decimal(36,18));\n } else {\n $result_prev_dates := array_append($result_prev_dates, $real_prev_dates[$selector]);\n $result_prev_values := array_append($result_prev_values, $real_prev_values[$selector]);\n }\n // we already appended one for current $real_prev_date_idx, then we need to go to next\n $real_prev_date_idx := $selector;\n break;\n }\n }\n }\n }\n\n // check if we have the same number of values and dates\n if array_length($current_dates) != array_length($result_prev_dates) {\n error('we have different number of dates and values');\n }\n if array_length($current_values) != array_length($result_prev_values) {\n error('we have different number of dates and values');\n }\n\n // calculate the index change\n if array_length($result_prev_dates) \u003e 0 {\n for $row_result in 1..array_length($result_prev_dates) {\n // if the expected_prev_date is null, then we don't have a real prev date\n if $result_prev_dates[$row_result] IS DISTINCT FROM NULL {\n return next $current_dates[$row_result], ($current_values[$row_result] - $result_prev_values[$row_result]) * 100.00::decimal(36,18) / $result_prev_values[$row_result];\n }\n }\n }",
1297
- "return_types": {
1298
- "is_table": true,
1299
- "fields": [
1300
- {
1301
- "name": "date_value",
1302
- "type": {
1303
- "name": "text",
1304
- "is_array": false,
1305
- "metadata": [0, 0]
1306
- }
1307
- },
1308
- {
1309
- "name": "value",
1310
- "type": {
1311
- "name": "decimal",
1312
- "is_array": false,
1313
- "metadata": [36, 18]
1314
- }
1315
- }
1316
- ]
1317
- },
1318
- "annotations": null
1319
- },
1320
- {
1321
- "name": "emit_values_if",
1322
- "parameters": [
1323
- {
1324
- "name": "$condition",
1325
- "type": {
1326
- "name": "bool",
1327
- "is_array": false,
1328
- "metadata": [0, 0]
1329
- }
1330
- },
1331
- {
1332
- "name": "$date_value",
1333
- "type": {
1334
- "name": "text",
1335
- "is_array": false,
1336
- "metadata": [0, 0]
1337
- }
1338
- },
1339
- {
1340
- "name": "$values",
1341
- "type": {
1342
- "name": "decimal",
1343
- "is_array": true,
1344
- "metadata": [36, 18]
1345
- }
1346
- },
1347
- {
1348
- "name": "$weights",
1349
- "type": {
1350
- "name": "decimal",
1351
- "is_array": true,
1352
- "metadata": [36, 18]
1353
- }
1354
- }
1355
- ],
1356
- "public": false,
1357
- "modifiers": ["VIEW"],
1358
- "body": "if $condition == true {\n if array_length($values) \u003e 0 {\n for $i in 1..array_length($values) {\n return next $date_value, $values[$i], $weights[$i];\n }\n }\n }",
1359
- "return_types": {
1360
- "is_table": true,
1361
- "fields": [
1362
- {
1363
- "name": "date_value",
1364
- "type": {
1365
- "name": "text",
1366
- "is_array": false,
1367
- "metadata": [0, 0]
1368
- }
1369
- },
1370
- {
1371
- "name": "value",
1372
- "type": {
1373
- "name": "decimal",
1374
- "is_array": false,
1375
- "metadata": [36, 18]
1376
- }
1377
- },
1378
- {
1379
- "name": "weight",
1380
- "type": {
1381
- "name": "decimal",
1382
- "is_array": false,
1383
- "metadata": [36, 18]
1384
- }
1385
- }
1386
- ]
1387
- },
1388
- "annotations": null
1389
- },
1390
- {
1391
- "name": "remove_array_element",
1392
- "parameters": [
1393
- {
1394
- "name": "$array",
1395
- "type": {
1396
- "name": "int",
1397
- "is_array": true,
1398
- "metadata": [0, 0]
1399
- }
1400
- },
1401
- {
1402
- "name": "$index",
1403
- "type": {
1404
- "name": "int",
1405
- "is_array": false,
1406
- "metadata": [0, 0]
1407
- }
1408
- }
1409
- ],
1410
- "public": false,
1411
- "modifiers": ["VIEW"],
1412
- "body": "$new_array int[];\n for $i in 1..array_length($array) {\n if $i != $index {\n $new_array := array_append($new_array, $array[$i]);\n }\n }\n\n return $new_array;",
1413
- "return_types": {
1414
- "is_table": false,
1415
- "fields": [
1416
- {
1417
- "name": "result",
1418
- "type": {
1419
- "name": "int",
1420
- "is_array": true,
1421
- "metadata": [0, 0]
1422
- }
1423
- }
1424
- ]
1425
- },
1426
- "annotations": null
1427
- },
1428
- {
1429
- "name": "array_update_element",
1430
- "parameters": [
1431
- {
1432
- "name": "$array",
1433
- "type": {
1434
- "name": "decimal",
1435
- "is_array": true,
1436
- "metadata": [36, 18]
1437
- }
1438
- },
1439
- {
1440
- "name": "$index",
1441
- "type": {
1442
- "name": "int",
1443
- "is_array": false,
1444
- "metadata": [0, 0]
1445
- }
1446
- },
1447
- {
1448
- "name": "$value",
1449
- "type": {
1450
- "name": "decimal",
1451
- "is_array": false,
1452
- "metadata": [36, 18]
1453
- }
1454
- }
1455
- ],
1456
- "public": false,
1457
- "modifiers": ["VIEW"],
1458
- "body": "$new_array decimal(36,18)[];\n for $i in 1..array_length($array) {\n if $i == $index {\n $new_array := array_append($new_array, $value);\n } else {\n $new_array := array_append($new_array, $array[$i]);\n }\n }\n return $new_array;",
1459
- "return_types": {
1460
- "is_table": false,
1461
- "fields": [
1462
- {
1463
- "name": "result",
1464
- "type": {
1465
- "name": "decimal",
1466
- "is_array": true,
1467
- "metadata": [36, 18]
1468
- }
1469
- }
1470
- ]
1471
- },
1472
- "annotations": null
1473
- },
1474
- {
1475
- "name": "get_dynamic_weight",
1476
- "parameters": [
1477
- {
1478
- "name": "$stream_id",
1479
- "type": {
1480
- "name": "text",
1481
- "is_array": false,
1482
- "metadata": [0, 0]
1483
- }
1484
- },
1485
- {
1486
- "name": "$date_value",
1487
- "type": {
1488
- "name": "text",
1489
- "is_array": false,
1490
- "metadata": [0, 0]
1491
- }
1492
- }
1493
- ],
1494
- "public": false,
1495
- "modifiers": ["VIEW"],
1496
- "body": "for $row in SELECT weight\n FROM taxonomies\n WHERE child_stream_id = $stream_id\n AND (start_date IS NULL OR start_date = '' OR start_date \u003c= $date_value)\n ORDER BY start_date DESC\n LIMIT 1 {\n return $row.weight;\n }\n\n // If no weight is found, we return the earliest weight available, this to ensure that we always have a weight\n // for the given date even if it's before the first weight's start_date\n // Would be better if COALESCE was supported\n for $row2 in SELECT weight\n FROM taxonomies\n WHERE child_stream_id = $stream_id\n ORDER BY start_date ASC\n LIMIT 1 {\n return $row2.weight;\n }",
1497
- "return_types": {
1498
- "is_table": false,
1499
- "fields": [
1500
- {
1501
- "name": "weight",
1502
- "type": {
1503
- "name": "decimal",
1504
- "is_array": false,
1505
- "metadata": [36, 18]
1506
- }
1507
- }
1508
- ]
1509
- },
1510
- "annotations": null
1511
- }
1512
- ],
1513
- "foreign_calls": [
1514
- {
1515
- "name": "ext_get_record",
1516
- "parameters": [
1517
- {
1518
- "name": "text",
1519
- "is_array": false,
1520
- "metadata": [0, 0]
1521
- },
1522
- {
1523
- "name": "text",
1524
- "is_array": false,
1525
- "metadata": [0, 0]
1526
- },
1527
- {
1528
- "name": "int",
1529
- "is_array": false,
1530
- "metadata": [0, 0]
1531
- }
1532
- ],
1533
- "return_types": {
1534
- "is_table": true,
1535
- "fields": [
1536
- {
1537
- "name": "date_value",
1538
- "type": {
1539
- "name": "text",
1540
- "is_array": false,
1541
- "metadata": [0, 0]
1542
- }
1543
- },
1544
- {
1545
- "name": "value",
1546
- "type": {
1547
- "name": "decimal",
1548
- "is_array": false,
1549
- "metadata": [36, 18]
1550
- }
1551
- }
1552
- ]
1553
- }
1554
- },
1555
- {
1556
- "name": "ext_get_index",
1557
- "parameters": [
1558
- {
1559
- "name": "text",
1560
- "is_array": false,
1561
- "metadata": [0, 0]
1562
- },
1563
- {
1564
- "name": "text",
1565
- "is_array": false,
1566
- "metadata": [0, 0]
1567
- },
1568
- {
1569
- "name": "int",
1570
- "is_array": false,
1571
- "metadata": [0, 0]
1572
- },
1573
- {
1574
- "name": "text",
1575
- "is_array": false,
1576
- "metadata": [0, 0]
1577
- }
1578
- ],
1579
- "return_types": {
1580
- "is_table": true,
1581
- "fields": [
1582
- {
1583
- "name": "date_value",
1584
- "type": {
1585
- "name": "text",
1586
- "is_array": false,
1587
- "metadata": [0, 0]
1588
- }
1589
- },
1590
- {
1591
- "name": "value",
1592
- "type": {
1593
- "name": "decimal",
1594
- "is_array": false,
1595
- "metadata": [36, 18]
1596
- }
1597
- }
1598
- ]
1599
- }
1600
- },
1601
- {
1602
- "name": "ext_get_first_record",
1603
- "parameters": [
1604
- {
1605
- "name": "text",
1606
- "is_array": false,
1607
- "metadata": [0, 0]
1608
- },
1609
- {
1610
- "name": "int",
1611
- "is_array": false,
1612
- "metadata": [0, 0]
1613
- }
1614
- ],
1615
- "return_types": {
1616
- "is_table": true,
1617
- "fields": [
1618
- {
1619
- "name": "date_value",
1620
- "type": {
1621
- "name": "text",
1622
- "is_array": false,
1623
- "metadata": [0, 0]
1624
- }
1625
- },
1626
- {
1627
- "name": "value",
1628
- "type": {
1629
- "name": "decimal",
1630
- "is_array": false,
1631
- "metadata": [36, 18]
1632
- }
1633
- }
1634
- ]
1635
- }
1636
- }
1637
- ]
1638
- }