zkevm-rom 0.0.1-security → 6.0.1

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.

Potentially problematic release.


This version of zkevm-rom might be problematic. Click here for more details.

Files changed (232) hide show
  1. package/.eslintrc.js +33 -0
  2. package/.github/CODEOWNERS +14 -0
  3. package/.github/ISSUE_TEMPLATE/bug.yml +38 -0
  4. package/.github/ISSUE_TEMPLATE/feature.yml +26 -0
  5. package/.github/ISSUE_TEMPLATE/question.yml +26 -0
  6. package/.github/workflows/main.yaml +40 -0
  7. package/LICENSE +636 -0
  8. package/README.md +23 -5
  9. package/audits/Hexens_Polygon_zkEVM_PUBLIC_27.02.23.pdf +0 -0
  10. package/audits/Polygon-zkEVM-Public-v1.1-verichains-19-03-2024.pdf +0 -0
  11. package/audits/zkEVM-ROM-upgrade-1-Spearbit-30-May.pdf +0 -0
  12. package/audits/zkEVM-ROM-upgrade-2-Spearbit-21-August.pdf +0 -0
  13. package/audits/zkEVM-engagement-1-Spearbit-27-March.pdf +0 -0
  14. package/audits/zkEVM-engagement-2-Spearbit-27-March.pdf +0 -0
  15. package/audits/zkEVM-engagement-3-Spearbit-6-April.pdf +0 -0
  16. package/counters/README.md +45 -0
  17. package/counters/counters-executor.js +80 -0
  18. package/counters/countersConstants.zkasm +370 -0
  19. package/counters/endIncludes.zkasm +18 -0
  20. package/counters/initIncludes.zkasm +2 -0
  21. package/counters/tests/MLOAD32.zkasm +27 -0
  22. package/counters/tests/MLOADX.zkasm +30 -0
  23. package/counters/tests/MSTORE32.zkasm +32 -0
  24. package/counters/tests/MSTOREX.zkasm +36 -0
  25. package/counters/tests/SHLarith.zkasm +28 -0
  26. package/counters/tests/SHLarithBit.zkasm +28 -0
  27. package/counters/tests/SHRarith.zkasm +28 -0
  28. package/counters/tests/SHRarithBit.zkasm +28 -0
  29. package/counters/tests/abs.zkasm +29 -0
  30. package/counters/tests/addBatchHashByteByByte.zkasm +31 -0
  31. package/counters/tests/computeGasSendCall.zkasm +30 -0
  32. package/counters/tests/divArith.zkasm +27 -0
  33. package/counters/tests/expAD.zkasm +30 -0
  34. package/counters/tests/getLenBits.zkasm +30 -0
  35. package/counters/tests/getLenBytes.zkasm +32 -0
  36. package/counters/tests/isEmptyAccount.zkasm +30 -0
  37. package/counters/tests/mulARITH.zkasm +28 -0
  38. package/counters/tests/offsetUtil.zkasm +29 -0
  39. package/counters/tests/opADDMOD.zkasm +28 -0
  40. package/counters/tests/opAdd.zkasm +27 -0
  41. package/counters/tests/opBLOCKHASH.zkasm +28 -0
  42. package/counters/tests/opCALL.zkasm +41 -0
  43. package/counters/tests/opCALLCODE.zkasm +41 -0
  44. package/counters/tests/opCALLDATACOPY.zkasm +28 -0
  45. package/counters/tests/opCALLDATALOAD.zkasm +27 -0
  46. package/counters/tests/opCODECOPY.zkasm +28 -0
  47. package/counters/tests/opCREATE.zkasm +35 -0
  48. package/counters/tests/opCREATE2.zkasm +35 -0
  49. package/counters/tests/opDELEGATECALL.zkasm +35 -0
  50. package/counters/tests/opDIV.zkasm +27 -0
  51. package/counters/tests/opEXP.zkasm +29 -0
  52. package/counters/tests/opEXTCODECOPY.zkasm +29 -0
  53. package/counters/tests/opMOD.zkasm +27 -0
  54. package/counters/tests/opMUL.zkasm +27 -0
  55. package/counters/tests/opMULMOD.zkasm +28 -0
  56. package/counters/tests/opRETURN.zkasm +32 -0
  57. package/counters/tests/opRETURNDATACOPY.zkasm +29 -0
  58. package/counters/tests/opREVERT.zkasm +32 -0
  59. package/counters/tests/opSDIV.zkasm +28 -0
  60. package/counters/tests/opSHA3.zkasm +28 -0
  61. package/counters/tests/opSIGNEXTEND.zkasm +27 -0
  62. package/counters/tests/opSMOD.zkasm +28 -0
  63. package/counters/tests/opSTATICCALL.zkasm +35 -0
  64. package/counters/tests/opSUB.zkasm +27 -0
  65. package/counters/tests/saveMem.zkasm +31 -0
  66. package/docs/opcode-cost-zk-counters.md +315 -0
  67. package/docs/usage-ecrecover.md +51 -0
  68. package/index.js +43 -0
  69. package/main/block-info.zkasm +204 -0
  70. package/main/constants.zkasm +145 -0
  71. package/main/ecrecover/addFpEc.zkasm +31 -0
  72. package/main/ecrecover/checkSqrtFpEc.zkasm +1558 -0
  73. package/main/ecrecover/constEc.zkasm +13 -0
  74. package/main/ecrecover/ecrecover.zkasm +280 -0
  75. package/main/ecrecover/invFnEc.zkasm +44 -0
  76. package/main/ecrecover/invFpEc.zkasm +45 -0
  77. package/main/ecrecover/mulFnEc.zkasm +36 -0
  78. package/main/ecrecover/mulFpEc.zkasm +36 -0
  79. package/main/ecrecover/mulPointEc.zkasm +311 -0
  80. package/main/ecrecover/sqFpEc.zkasm +38 -0
  81. package/main/ecrecover/sqrtFpEc.zkasm +70 -0
  82. package/main/end.zkasm +4 -0
  83. package/main/l2-tx-hash.zkasm +159 -0
  84. package/main/load-change-l2-block-utils.zkasm +11 -0
  85. package/main/load-change-l2-block.zkasm +28 -0
  86. package/main/load-tx-rlp-utils.zkasm +72 -0
  87. package/main/load-tx-rlp.zkasm +431 -0
  88. package/main/main.zkasm +237 -0
  89. package/main/map-opcodes.zkasm +274 -0
  90. package/main/modexp/array_lib/array_add_AGTB.zkasm +123 -0
  91. package/main/modexp/array_lib/array_add_short.zkasm +85 -0
  92. package/main/modexp/array_lib/array_div.zkasm +215 -0
  93. package/main/modexp/array_lib/array_div_long.zkasm +284 -0
  94. package/main/modexp/array_lib/array_div_short.zkasm +222 -0
  95. package/main/modexp/array_lib/array_mul.zkasm +97 -0
  96. package/main/modexp/array_lib/array_mul_long.zkasm +156 -0
  97. package/main/modexp/array_lib/array_mul_short.zkasm +127 -0
  98. package/main/modexp/array_lib/array_square.zkasm +246 -0
  99. package/main/modexp/array_lib/unused/array_add.zkasm +100 -0
  100. package/main/modexp/array_lib/unused/array_is_odd.zkasm +23 -0
  101. package/main/modexp/array_lib/unused/array_is_one.zkasm +33 -0
  102. package/main/modexp/array_lib/unused/array_is_zero.zkasm +34 -0
  103. package/main/modexp/array_lib/unused/array_sub_AGTB.zkasm +111 -0
  104. package/main/modexp/array_lib/unused/array_unshift.zkasm +37 -0
  105. package/main/modexp/array_lib/utils/array_compare.zkasm +82 -0
  106. package/main/modexp/array_lib/utils/array_trim.zkasm +49 -0
  107. package/main/modexp/constants.zkasm +5 -0
  108. package/main/modexp/modexp.zkasm +296 -0
  109. package/main/modexp/modexp_utils.zkasm +230 -0
  110. package/main/opcodes/arithmetic.zkasm +357 -0
  111. package/main/opcodes/block.zkasm +163 -0
  112. package/main/opcodes/calldata-returndata-code.zkasm +619 -0
  113. package/main/opcodes/comparison.zkasm +446 -0
  114. package/main/opcodes/context-information.zkasm +169 -0
  115. package/main/opcodes/create-terminate-context.zkasm +1011 -0
  116. package/main/opcodes/crypto.zkasm +96 -0
  117. package/main/opcodes/flow-control.zkasm +126 -0
  118. package/main/opcodes/logs.zkasm +193 -0
  119. package/main/opcodes/stack-operations.zkasm +658 -0
  120. package/main/opcodes/storage-memory.zkasm +313 -0
  121. package/main/pairings/BN254/addPointBN254.zkasm +245 -0
  122. package/main/pairings/BN254/ecAdd.zkasm +312 -0
  123. package/main/pairings/BN254/ecMul.zkasm +159 -0
  124. package/main/pairings/BN254/escalarMulBN254.zkasm +155 -0
  125. package/main/pairings/BN254/lineDiffPointsBN254.zkasm +83 -0
  126. package/main/pairings/BN254/lineSamePointsBN254.zkasm +96 -0
  127. package/main/pairings/FP12BN254/CYCLOFP12BN254/compressFp12BN254.zkasm +49 -0
  128. package/main/pairings/FP12BN254/CYCLOFP12BN254/decompressFp12BN254.zkasm +236 -0
  129. package/main/pairings/FP12BN254/CYCLOFP12BN254/expByXCompCycloFp12BN254.zkasm +444 -0
  130. package/main/pairings/FP12BN254/CYCLOFP12BN254/squareCompCycloFp12BN254.zkasm +212 -0
  131. package/main/pairings/FP12BN254/CYCLOFP12BN254/squareCycloFp12BN254.zkasm +228 -0
  132. package/main/pairings/FP12BN254/CYCLOFP12BN254/xBinDecompBN254.zkasm +64 -0
  133. package/main/pairings/FP12BN254/frob2Fp12BN254.zkasm +80 -0
  134. package/main/pairings/FP12BN254/frob3Fp12BN254.zkasm +96 -0
  135. package/main/pairings/FP12BN254/frobFp12BN254.zkasm +96 -0
  136. package/main/pairings/FP12BN254/inverseFp12BN254.zkasm +289 -0
  137. package/main/pairings/FP12BN254/mulFp12BN254.zkasm +408 -0
  138. package/main/pairings/FP12BN254/sparseMulAFp12BN254.zkasm +296 -0
  139. package/main/pairings/FP12BN254/sparseMulBFp12BN254.zkasm +291 -0
  140. package/main/pairings/FP12BN254/squareFp12BN254.zkasm +376 -0
  141. package/main/pairings/FP2BN254/addFp2BN254.zkasm +19 -0
  142. package/main/pairings/FP2BN254/escalarMulFp2BN254.zkasm +20 -0
  143. package/main/pairings/FP2BN254/invFp2BN254.zkasm +66 -0
  144. package/main/pairings/FP2BN254/mulFp2BN254.zkasm +19 -0
  145. package/main/pairings/FP2BN254/squareFp2BN254.zkasm +21 -0
  146. package/main/pairings/FP2BN254/subFp2BN254.zkasm +19 -0
  147. package/main/pairings/FP4BN254/squareFp4BN254.zkasm +76 -0
  148. package/main/pairings/FP6BN254/addFp6BN254.zkasm +59 -0
  149. package/main/pairings/FP6BN254/escalarMulFp6BN254.zkasm +51 -0
  150. package/main/pairings/FP6BN254/inverseFp6BN254.zkasm +208 -0
  151. package/main/pairings/FP6BN254/mulFp6BN254.zkasm +201 -0
  152. package/main/pairings/FP6BN254/sparseMulAFp6BN254.zkasm +65 -0
  153. package/main/pairings/FP6BN254/sparseMulBFp6BN254.zkasm +134 -0
  154. package/main/pairings/FP6BN254/sparseMulCFp6BN254.zkasm +128 -0
  155. package/main/pairings/FP6BN254/squareFp6BN254.zkasm +147 -0
  156. package/main/pairings/FP6BN254/subFp6BN254.zkasm +59 -0
  157. package/main/pairings/FPBN254/addFpBN254.zkasm +29 -0
  158. package/main/pairings/FPBN254/invFpBN254.zkasm +55 -0
  159. package/main/pairings/FPBN254/mulFpBN254.zkasm +29 -0
  160. package/main/pairings/FPBN254/reduceFpBN254.zkasm +25 -0
  161. package/main/pairings/FPBN254/squareFpBN254.zkasm +31 -0
  162. package/main/pairings/FPBN254/subFpBN254.zkasm +36 -0
  163. package/main/pairings/FRBN254/reduceFrBN254.zkasm +25 -0
  164. package/main/pairings/constants.zkasm +62 -0
  165. package/main/pairings/ecPairing.zkasm +244 -0
  166. package/main/pairings/finalExpBN254.zkasm +2095 -0
  167. package/main/pairings/halfPairingBN254.zkasm +428 -0
  168. package/main/pairings/loopLengthBN254.zkasm +75 -0
  169. package/main/pairings/millerLoopBN254.zkasm +741 -0
  170. package/main/pairings/pairingBN254.zkasm +481 -0
  171. package/main/pairings/unused/addFp12BN254.zkasm +130 -0
  172. package/main/pairings/unused/expByXCycloFp12BN254.zkasm +411 -0
  173. package/main/pairings/unused/expFp12BN254.zkasm +333 -0
  174. package/main/pairings/unused/subFp12BN254.zkasm +130 -0
  175. package/main/pairings/unused/xPseudoBinDecompBN254.zkasm +68 -0
  176. package/main/pairings/utilsTests/expCycloFp12BN254.zkasm +334 -0
  177. package/main/precompiled/end.zkasm +42 -0
  178. package/main/precompiled/identity.zkasm +99 -0
  179. package/main/precompiled/pre-ecAdd.zkasm +84 -0
  180. package/main/precompiled/pre-ecMul.zkasm +82 -0
  181. package/main/precompiled/pre-ecPairing.zkasm +72 -0
  182. package/main/precompiled/pre-ecrecover.zkasm +71 -0
  183. package/main/precompiled/pre-modexp.zkasm +367 -0
  184. package/main/precompiled/pre-sha2-256.zkasm +125 -0
  185. package/main/precompiled/revert-precompiled.zkasm +25 -0
  186. package/main/precompiled/selector.zkasm +77 -0
  187. package/main/process-change-l2-block.zkasm +147 -0
  188. package/main/process-tx.zkasm +587 -0
  189. package/main/tables/2-exp.zkasm +260 -0
  190. package/main/touched.zkasm +118 -0
  191. package/main/utils.zkasm +2335 -0
  192. package/main/vars.zkasm +117 -0
  193. package/package.json +62 -3
  194. package/test/bytes-length.zkasm +39 -0
  195. package/test/ecrecover.zkasm +538 -0
  196. package/test/lt4-test.zkasm +38 -0
  197. package/test/mstorex.zkasm +191 -0
  198. package/test/opcalldatacopy.ignore.zkasm +331 -0
  199. package/test/performance/read-push.zkasm +71 -0
  200. package/test/read-push.zkasm +304 -0
  201. package/test/testArrayArith.zkasm +1099 -0
  202. package/test/testArrayUtils.zkasm +335 -0
  203. package/test/testCycloFp12ArithBN254.zkasm +548 -0
  204. package/test/testEcAdd.zkasm +252 -0
  205. package/test/testEcMul.zkasm +231 -0
  206. package/test/testEcPairing.zkasm +436 -0
  207. package/test/testFinalExpBn254.zkasm +139 -0
  208. package/test/testFp12ArithBN254.zkasm +692 -0
  209. package/test/testFp2ArithBN254.zkasm +185 -0
  210. package/test/testFp4ArithBN254.zkasm +128 -0
  211. package/test/testFp6ArithBN254.zkasm +260 -0
  212. package/test/testFpArithBN254.zkasm +159 -0
  213. package/test/testFrArithBN254.zkasm +113 -0
  214. package/test/testHalfPairingBN254.zkasm +285 -0
  215. package/test/testModExp.zkasm +586 -0
  216. package/test/testModExpReturn.zkasm +81 -0
  217. package/test/testPairingBN254.zkasm +463 -0
  218. package/test/testPointArithBN254.zkasm +270 -0
  219. package/test/testSHA256.zkasm +27 -0
  220. package/test/touched-assert.zkasm +59 -0
  221. package/test/utils-expAD.zkasm +48 -0
  222. package/test/utils-getLenBytes.zkasm +36 -0
  223. package/tools/audit-tools/registry-op-checker.js +71 -0
  224. package/tools/get-not-used-labels.js +31 -0
  225. package/tools/helpers/helpers.js +47 -0
  226. package/tools/modexp-utils/README.md +5 -0
  227. package/tools/modexp-utils/modexp-test-gen.js +168 -0
  228. package/tools/modexp-utils/modexp-test-int.sage +37 -0
  229. package/tools/parallel-testing/checker.sh +6 -0
  230. package/tools/parallel-testing/gen-parallel-tests.js +78 -0
  231. package/tools/parallel-testing/parallel-tests-sample/sample.test.js +136 -0
  232. package/tools/run-tests-zkasm.js +83 -0
@@ -0,0 +1,408 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP6 arithmetic
3
+ ;;
4
+ ;; mulFp12BN254:
5
+ ;; in: (a1 + a2·w),(b1 + b2·w) ∈ Fp12, where ai,bi ∈ Fp6
6
+ ;; out: (a1 + a2·w)·(b1 + b2·w) = (c1 + c2·w) ∈ Fp12, where:
7
+ ;; - c1 = a1·b1 + a2·b2·v
8
+ ;; - c2 = (a1+a2)·(b1+b2) - a1·b1 - a2·b2
9
+ ;;
10
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11
+
12
+ VAR GLOBAL mulFp12BN254_a11_x
13
+ VAR GLOBAL mulFp12BN254_a11_y
14
+ VAR GLOBAL mulFp12BN254_a12_x
15
+ VAR GLOBAL mulFp12BN254_a12_y
16
+ VAR GLOBAL mulFp12BN254_a13_x
17
+ VAR GLOBAL mulFp12BN254_a13_y
18
+ VAR GLOBAL mulFp12BN254_a21_x
19
+ VAR GLOBAL mulFp12BN254_a21_y
20
+ VAR GLOBAL mulFp12BN254_a22_x
21
+ VAR GLOBAL mulFp12BN254_a22_y
22
+ VAR GLOBAL mulFp12BN254_a23_x
23
+ VAR GLOBAL mulFp12BN254_a23_y
24
+ VAR GLOBAL mulFp12BN254_b11_x
25
+ VAR GLOBAL mulFp12BN254_b11_y
26
+ VAR GLOBAL mulFp12BN254_b12_x
27
+ VAR GLOBAL mulFp12BN254_b12_y
28
+ VAR GLOBAL mulFp12BN254_b13_x
29
+ VAR GLOBAL mulFp12BN254_b13_y
30
+ VAR GLOBAL mulFp12BN254_b21_x
31
+ VAR GLOBAL mulFp12BN254_b21_y
32
+ VAR GLOBAL mulFp12BN254_b22_x
33
+ VAR GLOBAL mulFp12BN254_b22_y
34
+ VAR GLOBAL mulFp12BN254_b23_x
35
+ VAR GLOBAL mulFp12BN254_b23_y
36
+ VAR GLOBAL mulFp12BN254_c11_x
37
+ VAR GLOBAL mulFp12BN254_c11_y
38
+ VAR GLOBAL mulFp12BN254_c12_x
39
+ VAR GLOBAL mulFp12BN254_c12_y
40
+ VAR GLOBAL mulFp12BN254_c13_x
41
+ VAR GLOBAL mulFp12BN254_c13_y
42
+ VAR GLOBAL mulFp12BN254_c21_x
43
+ VAR GLOBAL mulFp12BN254_c21_y
44
+ VAR GLOBAL mulFp12BN254_c22_x
45
+ VAR GLOBAL mulFp12BN254_c22_y
46
+ VAR GLOBAL mulFp12BN254_c23_x
47
+ VAR GLOBAL mulFp12BN254_c23_y
48
+
49
+ VAR GLOBAL mulFp12BN254_a1b1mul1_x
50
+ VAR GLOBAL mulFp12BN254_a1b1mul1_y
51
+ VAR GLOBAL mulFp12BN254_a1b1mul2_x
52
+ VAR GLOBAL mulFp12BN254_a1b1mul2_y
53
+ VAR GLOBAL mulFp12BN254_a1b1mul3_x
54
+ VAR GLOBAL mulFp12BN254_a1b1mul3_y
55
+ VAR GLOBAL mulFp12BN254_a2b2mul1_x
56
+ VAR GLOBAL mulFp12BN254_a2b2mul1_y
57
+ VAR GLOBAL mulFp12BN254_a2b2mul2_x
58
+ VAR GLOBAL mulFp12BN254_a2b2mul2_y
59
+ VAR GLOBAL mulFp12BN254_a2b2mul3_x
60
+ VAR GLOBAL mulFp12BN254_a2b2mul3_y
61
+ VAR GLOBAL mulFp12BN254_a2b2vmul1_x
62
+ VAR GLOBAL mulFp12BN254_a2b2vmul1_y
63
+ VAR GLOBAL mulFp12BN254_a2b2vmul2_x
64
+ VAR GLOBAL mulFp12BN254_a2b2vmul2_y
65
+ VAR GLOBAL mulFp12BN254_a2b2vmul3_x
66
+ VAR GLOBAL mulFp12BN254_a2b2vmul3_y
67
+
68
+ VAR GLOBAL mulFp12BN254_a1a2sum1_x
69
+ VAR GLOBAL mulFp12BN254_a1a2sum1_y
70
+ VAR GLOBAL mulFp12BN254_a1a2sum2_x
71
+ VAR GLOBAL mulFp12BN254_a1a2sum2_y
72
+ VAR GLOBAL mulFp12BN254_a1a2sum3_x
73
+ VAR GLOBAL mulFp12BN254_a1a2sum3_y
74
+ VAR GLOBAL mulFp12BN254_b1b2sum1_x
75
+ VAR GLOBAL mulFp12BN254_b1b2sum1_y
76
+ VAR GLOBAL mulFp12BN254_b1b2sum2_x
77
+ VAR GLOBAL mulFp12BN254_b1b2sum2_y
78
+ VAR GLOBAL mulFp12BN254_b1b2sum3_x
79
+ VAR GLOBAL mulFp12BN254_b1b2sum3_y
80
+
81
+ VAR GLOBAL mulFp12BN254_RR
82
+
83
+ mulFp12BN254:
84
+ RR :MSTORE(mulFp12BN254_RR)
85
+
86
+ ; 1] a1·b1
87
+ $ => A :MLOAD(mulFp12BN254_a11_x)
88
+ $ => B :MLOAD(mulFp12BN254_a11_y)
89
+ A :MSTORE(mulFp6BN254_a1_x)
90
+ B :MSTORE(mulFp6BN254_a1_y)
91
+ $ => A :MLOAD(mulFp12BN254_a12_x)
92
+ $ => B :MLOAD(mulFp12BN254_a12_y)
93
+ A :MSTORE(mulFp6BN254_a2_x)
94
+ B :MSTORE(mulFp6BN254_a2_y)
95
+ $ => A :MLOAD(mulFp12BN254_a13_x)
96
+ $ => B :MLOAD(mulFp12BN254_a13_y)
97
+ A :MSTORE(mulFp6BN254_a3_x)
98
+ B :MSTORE(mulFp6BN254_a3_y)
99
+
100
+ $ => A :MLOAD(mulFp12BN254_b11_x)
101
+ $ => B :MLOAD(mulFp12BN254_b11_y)
102
+ A :MSTORE(mulFp6BN254_b1_x)
103
+ B :MSTORE(mulFp6BN254_b1_y)
104
+ $ => A :MLOAD(mulFp12BN254_b12_x)
105
+ $ => B :MLOAD(mulFp12BN254_b12_y)
106
+ A :MSTORE(mulFp6BN254_b2_x)
107
+ B :MSTORE(mulFp6BN254_b2_y)
108
+ $ => A :MLOAD(mulFp12BN254_b13_x)
109
+ $ => B :MLOAD(mulFp12BN254_b13_y)
110
+ A :MSTORE(mulFp6BN254_b3_x)
111
+ B :MSTORE(mulFp6BN254_b3_y), CALL(mulFp6BN254)
112
+ $ => A :MLOAD(mulFp6BN254_c1_x)
113
+ $ => B :MLOAD(mulFp6BN254_c1_y)
114
+ A :MSTORE(mulFp12BN254_a1b1mul1_x)
115
+ B :MSTORE(mulFp12BN254_a1b1mul1_y)
116
+ $ => A :MLOAD(mulFp6BN254_c2_x)
117
+ $ => B :MLOAD(mulFp6BN254_c2_y)
118
+ A :MSTORE(mulFp12BN254_a1b1mul2_x)
119
+ B :MSTORE(mulFp12BN254_a1b1mul2_y)
120
+ $ => A :MLOAD(mulFp6BN254_c3_x)
121
+ $ => B :MLOAD(mulFp6BN254_c3_y)
122
+ A :MSTORE(mulFp12BN254_a1b1mul3_x)
123
+ B :MSTORE(mulFp12BN254_a1b1mul3_y)
124
+
125
+ ; 2] a2·b2
126
+ $ => A :MLOAD(mulFp12BN254_a21_x)
127
+ $ => B :MLOAD(mulFp12BN254_a21_y)
128
+ A :MSTORE(mulFp6BN254_a1_x)
129
+ B :MSTORE(mulFp6BN254_a1_y)
130
+ $ => A :MLOAD(mulFp12BN254_a22_x)
131
+ $ => B :MLOAD(mulFp12BN254_a22_y)
132
+ A :MSTORE(mulFp6BN254_a2_x)
133
+ B :MSTORE(mulFp6BN254_a2_y)
134
+ $ => A :MLOAD(mulFp12BN254_a23_x)
135
+ $ => B :MLOAD(mulFp12BN254_a23_y)
136
+ A :MSTORE(mulFp6BN254_a3_x)
137
+ B :MSTORE(mulFp6BN254_a3_y)
138
+
139
+ $ => A :MLOAD(mulFp12BN254_b21_x)
140
+ $ => B :MLOAD(mulFp12BN254_b21_y)
141
+ A :MSTORE(mulFp6BN254_b1_x)
142
+ B :MSTORE(mulFp6BN254_b1_y)
143
+ $ => A :MLOAD(mulFp12BN254_b22_x)
144
+ $ => B :MLOAD(mulFp12BN254_b22_y)
145
+ A :MSTORE(mulFp6BN254_b2_x)
146
+ B :MSTORE(mulFp6BN254_b2_y)
147
+ $ => A :MLOAD(mulFp12BN254_b23_x)
148
+ $ => B :MLOAD(mulFp12BN254_b23_y)
149
+ A :MSTORE(mulFp6BN254_b3_x)
150
+ B :MSTORE(mulFp6BN254_b3_y), CALL(mulFp6BN254)
151
+ $ => A :MLOAD(mulFp6BN254_c1_x)
152
+ $ => B :MLOAD(mulFp6BN254_c1_y)
153
+ A :MSTORE(mulFp12BN254_a2b2mul1_x)
154
+ B :MSTORE(mulFp12BN254_a2b2mul1_y)
155
+ $ => A :MLOAD(mulFp6BN254_c2_x)
156
+ $ => B :MLOAD(mulFp6BN254_c2_y)
157
+ A :MSTORE(mulFp12BN254_a2b2mul2_x)
158
+ B :MSTORE(mulFp12BN254_a2b2mul2_y)
159
+ $ => A :MLOAD(mulFp6BN254_c3_x)
160
+ $ => B :MLOAD(mulFp6BN254_c3_y)
161
+ A :MSTORE(mulFp12BN254_a2b2mul3_x)
162
+ B :MSTORE(mulFp12BN254_a2b2mul3_y)
163
+
164
+ ; 3] a2·b2·v
165
+ $ => A :MLOAD(mulFp12BN254_a2b2mul1_x)
166
+ $ => B :MLOAD(mulFp12BN254_a2b2mul1_y)
167
+ A :MSTORE(sparseMulAFp6BN254_a1_x)
168
+ B :MSTORE(sparseMulAFp6BN254_a1_y)
169
+ $ => A :MLOAD(mulFp12BN254_a2b2mul2_x)
170
+ $ => B :MLOAD(mulFp12BN254_a2b2mul2_y)
171
+ A :MSTORE(sparseMulAFp6BN254_a2_x)
172
+ B :MSTORE(sparseMulAFp6BN254_a2_y)
173
+ $ => A :MLOAD(mulFp12BN254_a2b2mul3_x)
174
+ $ => B :MLOAD(mulFp12BN254_a2b2mul3_y)
175
+ A :MSTORE(sparseMulAFp6BN254_a3_x)
176
+ B :MSTORE(sparseMulAFp6BN254_a3_y)
177
+
178
+ 1n :MSTORE(sparseMulAFp6BN254_b2_x)
179
+ 0n :MSTORE(sparseMulAFp6BN254_b2_y), CALL(sparseMulAFp6BN254)
180
+ $ => A :MLOAD(sparseMulAFp6BN254_c1_x)
181
+ $ => B :MLOAD(sparseMulAFp6BN254_c1_y)
182
+ A :MSTORE(mulFp12BN254_a2b2vmul1_x)
183
+ B :MSTORE(mulFp12BN254_a2b2vmul1_y)
184
+ $ => A :MLOAD(sparseMulAFp6BN254_c2_x)
185
+ $ => B :MLOAD(sparseMulAFp6BN254_c2_y)
186
+ A :MSTORE(mulFp12BN254_a2b2vmul2_x)
187
+ B :MSTORE(mulFp12BN254_a2b2vmul2_y)
188
+ $ => A :MLOAD(sparseMulAFp6BN254_c3_x)
189
+ $ => B :MLOAD(sparseMulAFp6BN254_c3_y)
190
+ A :MSTORE(mulFp12BN254_a2b2vmul3_x)
191
+ B :MSTORE(mulFp12BN254_a2b2vmul3_y)
192
+
193
+ ; 4] c1 = a1·b1 + a2·b2·v
194
+ $ => A :MLOAD(mulFp12BN254_a1b1mul1_x)
195
+ $ => B :MLOAD(mulFp12BN254_a1b1mul1_y)
196
+ A :MSTORE(addFp6BN254_a1_x)
197
+ B :MSTORE(addFp6BN254_a1_y)
198
+ $ => A :MLOAD(mulFp12BN254_a1b1mul2_x)
199
+ $ => B :MLOAD(mulFp12BN254_a1b1mul2_y)
200
+ A :MSTORE(addFp6BN254_a2_x)
201
+ B :MSTORE(addFp6BN254_a2_y)
202
+ $ => A :MLOAD(mulFp12BN254_a1b1mul3_x)
203
+ $ => B :MLOAD(mulFp12BN254_a1b1mul3_y)
204
+ A :MSTORE(addFp6BN254_a3_x)
205
+ B :MSTORE(addFp6BN254_a3_y)
206
+
207
+ $ => A :MLOAD(mulFp12BN254_a2b2vmul1_x)
208
+ $ => B :MLOAD(mulFp12BN254_a2b2vmul1_y)
209
+ A :MSTORE(addFp6BN254_b1_x)
210
+ B :MSTORE(addFp6BN254_b1_y)
211
+ $ => A :MLOAD(mulFp12BN254_a2b2vmul2_x)
212
+ $ => B :MLOAD(mulFp12BN254_a2b2vmul2_y)
213
+ A :MSTORE(addFp6BN254_b2_x)
214
+ B :MSTORE(addFp6BN254_b2_y)
215
+ $ => A :MLOAD(mulFp12BN254_a2b2vmul3_x)
216
+ $ => B :MLOAD(mulFp12BN254_a2b2vmul3_y)
217
+ A :MSTORE(addFp6BN254_b3_x)
218
+ B :MSTORE(addFp6BN254_b3_y), CALL(addFp6BN254)
219
+
220
+ $ => A :MLOAD(addFp6BN254_c1_x)
221
+ $ => B :MLOAD(addFp6BN254_c1_y)
222
+ A :MSTORE(mulFp12BN254_c11_x)
223
+ B :MSTORE(mulFp12BN254_c11_y)
224
+ $ => A :MLOAD(addFp6BN254_c2_x)
225
+ $ => B :MLOAD(addFp6BN254_c2_y)
226
+ A :MSTORE(mulFp12BN254_c12_x)
227
+ B :MSTORE(mulFp12BN254_c12_y)
228
+ $ => A :MLOAD(addFp6BN254_c3_x)
229
+ $ => B :MLOAD(addFp6BN254_c3_y)
230
+ A :MSTORE(mulFp12BN254_c13_x)
231
+ B :MSTORE(mulFp12BN254_c13_y)
232
+
233
+ ; 4] a1+a2
234
+ $ => A :MLOAD(mulFp12BN254_a11_x)
235
+ $ => B :MLOAD(mulFp12BN254_a11_y)
236
+ A :MSTORE(addFp6BN254_a1_x)
237
+ B :MSTORE(addFp6BN254_a1_y)
238
+ $ => A :MLOAD(mulFp12BN254_a12_x)
239
+ $ => B :MLOAD(mulFp12BN254_a12_y)
240
+ A :MSTORE(addFp6BN254_a2_x)
241
+ B :MSTORE(addFp6BN254_a2_y)
242
+ $ => A :MLOAD(mulFp12BN254_a13_x)
243
+ $ => B :MLOAD(mulFp12BN254_a13_y)
244
+ A :MSTORE(addFp6BN254_a3_x)
245
+ B :MSTORE(addFp6BN254_a3_y)
246
+
247
+ $ => A :MLOAD(mulFp12BN254_a21_x)
248
+ $ => B :MLOAD(mulFp12BN254_a21_y)
249
+ A :MSTORE(addFp6BN254_b1_x)
250
+ B :MSTORE(addFp6BN254_b1_y)
251
+ $ => A :MLOAD(mulFp12BN254_a22_x)
252
+ $ => B :MLOAD(mulFp12BN254_a22_y)
253
+ A :MSTORE(addFp6BN254_b2_x)
254
+ B :MSTORE(addFp6BN254_b2_y)
255
+ $ => A :MLOAD(mulFp12BN254_a23_x)
256
+ $ => B :MLOAD(mulFp12BN254_a23_y)
257
+ A :MSTORE(addFp6BN254_b3_x)
258
+ B :MSTORE(addFp6BN254_b3_y), CALL(addFp6BN254)
259
+
260
+ $ => A :MLOAD(addFp6BN254_c1_x)
261
+ $ => B :MLOAD(addFp6BN254_c1_y)
262
+ A :MSTORE(mulFp12BN254_a1a2sum1_x)
263
+ B :MSTORE(mulFp12BN254_a1a2sum1_y)
264
+ $ => A :MLOAD(addFp6BN254_c2_x)
265
+ $ => B :MLOAD(addFp6BN254_c2_y)
266
+ A :MSTORE(mulFp12BN254_a1a2sum2_x)
267
+ B :MSTORE(mulFp12BN254_a1a2sum2_y)
268
+ $ => A :MLOAD(addFp6BN254_c3_x)
269
+ $ => B :MLOAD(addFp6BN254_c3_y)
270
+ A :MSTORE(mulFp12BN254_a1a2sum3_x)
271
+ B :MSTORE(mulFp12BN254_a1a2sum3_y)
272
+
273
+
274
+ ; 5] b1+b2
275
+ $ => A :MLOAD(mulFp12BN254_b11_x)
276
+ $ => B :MLOAD(mulFp12BN254_b11_y)
277
+ A :MSTORE(addFp6BN254_a1_x)
278
+ B :MSTORE(addFp6BN254_a1_y)
279
+ $ => A :MLOAD(mulFp12BN254_b12_x)
280
+ $ => B :MLOAD(mulFp12BN254_b12_y)
281
+ A :MSTORE(addFp6BN254_a2_x)
282
+ B :MSTORE(addFp6BN254_a2_y)
283
+ $ => A :MLOAD(mulFp12BN254_b13_x)
284
+ $ => B :MLOAD(mulFp12BN254_b13_y)
285
+ A :MSTORE(addFp6BN254_a3_x)
286
+ B :MSTORE(addFp6BN254_a3_y)
287
+
288
+ $ => A :MLOAD(mulFp12BN254_b21_x)
289
+ $ => B :MLOAD(mulFp12BN254_b21_y)
290
+ A :MSTORE(addFp6BN254_b1_x)
291
+ B :MSTORE(addFp6BN254_b1_y)
292
+ $ => A :MLOAD(mulFp12BN254_b22_x)
293
+ $ => B :MLOAD(mulFp12BN254_b22_y)
294
+ A :MSTORE(addFp6BN254_b2_x)
295
+ B :MSTORE(addFp6BN254_b2_y)
296
+ $ => A :MLOAD(mulFp12BN254_b23_x)
297
+ $ => B :MLOAD(mulFp12BN254_b23_y)
298
+ A :MSTORE(addFp6BN254_b3_x)
299
+ B :MSTORE(addFp6BN254_b3_y), CALL(addFp6BN254)
300
+
301
+ $ => A :MLOAD(addFp6BN254_c1_x)
302
+ $ => B :MLOAD(addFp6BN254_c1_y)
303
+ A :MSTORE(mulFp12BN254_b1b2sum1_x)
304
+ B :MSTORE(mulFp12BN254_b1b2sum1_y)
305
+ $ => A :MLOAD(addFp6BN254_c2_x)
306
+ $ => B :MLOAD(addFp6BN254_c2_y)
307
+ A :MSTORE(mulFp12BN254_b1b2sum2_x)
308
+ B :MSTORE(mulFp12BN254_b1b2sum2_y)
309
+ $ => A :MLOAD(addFp6BN254_c3_x)
310
+ $ => B :MLOAD(addFp6BN254_c3_y)
311
+ A :MSTORE(mulFp12BN254_b1b2sum3_x)
312
+ B :MSTORE(mulFp12BN254_b1b2sum3_y)
313
+
314
+ ; 7] c2 = (a1+a2)·(b1+b2) - a1·b1 - a2·b2
315
+ $ => A :MLOAD(mulFp12BN254_a1a2sum1_x)
316
+ $ => B :MLOAD(mulFp12BN254_a1a2sum1_y)
317
+ A :MSTORE(mulFp6BN254_a1_x)
318
+ B :MSTORE(mulFp6BN254_a1_y)
319
+ $ => A :MLOAD(mulFp12BN254_a1a2sum2_x)
320
+ $ => B :MLOAD(mulFp12BN254_a1a2sum2_y)
321
+ A :MSTORE(mulFp6BN254_a2_x)
322
+ B :MSTORE(mulFp6BN254_a2_y)
323
+ $ => A :MLOAD(mulFp12BN254_a1a2sum3_x)
324
+ $ => B :MLOAD(mulFp12BN254_a1a2sum3_y)
325
+ A :MSTORE(mulFp6BN254_a3_x)
326
+ B :MSTORE(mulFp6BN254_a3_y)
327
+
328
+
329
+ $ => A :MLOAD(mulFp12BN254_b1b2sum1_x)
330
+ $ => B :MLOAD(mulFp12BN254_b1b2sum1_y)
331
+ A :MSTORE(mulFp6BN254_b1_x)
332
+ B :MSTORE(mulFp6BN254_b1_y)
333
+ $ => A :MLOAD(mulFp12BN254_b1b2sum2_x)
334
+ $ => B :MLOAD(mulFp12BN254_b1b2sum2_y)
335
+ A :MSTORE(mulFp6BN254_b2_x)
336
+ B :MSTORE(mulFp6BN254_b2_y)
337
+ $ => A :MLOAD(mulFp12BN254_b1b2sum3_x)
338
+ $ => B :MLOAD(mulFp12BN254_b1b2sum3_y)
339
+ A :MSTORE(mulFp6BN254_b3_x)
340
+ B :MSTORE(mulFp6BN254_b3_y), CALL(mulFp6BN254)
341
+
342
+ $ => A :MLOAD(mulFp6BN254_c1_x)
343
+ $ => B :MLOAD(mulFp6BN254_c1_y)
344
+ A :MSTORE(subFp6BN254_a1_x)
345
+ B :MSTORE(subFp6BN254_a1_y)
346
+ $ => A :MLOAD(mulFp6BN254_c2_x)
347
+ $ => B :MLOAD(mulFp6BN254_c2_y)
348
+ A :MSTORE(subFp6BN254_a2_x)
349
+ B :MSTORE(subFp6BN254_a2_y)
350
+ $ => A :MLOAD(mulFp6BN254_c3_x)
351
+ $ => B :MLOAD(mulFp6BN254_c3_y)
352
+ A :MSTORE(subFp6BN254_a3_x)
353
+ B :MSTORE(subFp6BN254_a3_y)
354
+
355
+ $ => A :MLOAD(mulFp12BN254_a1b1mul1_x)
356
+ $ => B :MLOAD(mulFp12BN254_a1b1mul1_y)
357
+ A :MSTORE(subFp6BN254_b1_x)
358
+ B :MSTORE(subFp6BN254_b1_y)
359
+ $ => A :MLOAD(mulFp12BN254_a1b1mul2_x)
360
+ $ => B :MLOAD(mulFp12BN254_a1b1mul2_y)
361
+ A :MSTORE(subFp6BN254_b2_x)
362
+ B :MSTORE(subFp6BN254_b2_y)
363
+ $ => A :MLOAD(mulFp12BN254_a1b1mul3_x)
364
+ $ => B :MLOAD(mulFp12BN254_a1b1mul3_y)
365
+ A :MSTORE(subFp6BN254_b3_x)
366
+ B :MSTORE(subFp6BN254_b3_y), CALL(subFp6BN254)
367
+
368
+ $ => A :MLOAD(subFp6BN254_c1_x)
369
+ $ => B :MLOAD(subFp6BN254_c1_y)
370
+ A :MSTORE(subFp6BN254_a1_x)
371
+ B :MSTORE(subFp6BN254_a1_y)
372
+ $ => A :MLOAD(subFp6BN254_c2_x)
373
+ $ => B :MLOAD(subFp6BN254_c2_y)
374
+ A :MSTORE(subFp6BN254_a2_x)
375
+ B :MSTORE(subFp6BN254_a2_y)
376
+ $ => A :MLOAD(subFp6BN254_c3_x)
377
+ $ => B :MLOAD(subFp6BN254_c3_y)
378
+ A :MSTORE(subFp6BN254_a3_x)
379
+ B :MSTORE(subFp6BN254_a3_y)
380
+
381
+ $ => A :MLOAD(mulFp12BN254_a2b2mul1_x)
382
+ $ => B :MLOAD(mulFp12BN254_a2b2mul1_y)
383
+ A :MSTORE(subFp6BN254_b1_x)
384
+ B :MSTORE(subFp6BN254_b1_y)
385
+ $ => A :MLOAD(mulFp12BN254_a2b2mul2_x)
386
+ $ => B :MLOAD(mulFp12BN254_a2b2mul2_y)
387
+ A :MSTORE(subFp6BN254_b2_x)
388
+ B :MSTORE(subFp6BN254_b2_y)
389
+ $ => A :MLOAD(mulFp12BN254_a2b2mul3_x)
390
+ $ => B :MLOAD(mulFp12BN254_a2b2mul3_y)
391
+ A :MSTORE(subFp6BN254_b3_x)
392
+ B :MSTORE(subFp6BN254_b3_y), CALL(subFp6BN254)
393
+
394
+ $ => A :MLOAD(subFp6BN254_c1_x)
395
+ $ => B :MLOAD(subFp6BN254_c1_y)
396
+ A :MSTORE(mulFp12BN254_c21_x)
397
+ B :MSTORE(mulFp12BN254_c21_y)
398
+ $ => A :MLOAD(subFp6BN254_c2_x)
399
+ $ => B :MLOAD(subFp6BN254_c2_y)
400
+ A :MSTORE(mulFp12BN254_c22_x)
401
+ B :MSTORE(mulFp12BN254_c22_y)
402
+ $ => A :MLOAD(subFp6BN254_c3_x)
403
+ $ => B :MLOAD(subFp6BN254_c3_y)
404
+ A :MSTORE(mulFp12BN254_c23_x)
405
+ B :MSTORE(mulFp12BN254_c23_y)
406
+
407
+ $ => RR :MLOAD(mulFp12BN254_RR)
408
+ :RETURN