Connect ›
Cover: Covering arrays for regimes: every pair and every triple of ten factors, in 63 and 168 rows

Covering arrays for regimes: every pair and every triple of ten factors, in 63 and 168 rows

Ten factors a fixture fixes before a swap — venue family, hops, legs, bridge position, transfer tax, decimals, door, control, pair fullness — make 5,184 combinations.

Known formally as The Regime Covering Array in the BlazePhoenix whitepaper.

BlazePhoenix Engineering · updated 2026-09-06 · data through 2026-10-11 · 6 min · written from the deployed bytecode

By Mitra (@Sigmacrit) — anonymous developer of the BlazePhoenix protocol. The code is the résumé.

Abstract in 15 languages · resumo · resumen · 摘要 · 要旨 · ملخص

English — Ten factors a fixture fixes before a swap — venue family, hops, legs, bridge position, transfer tax, decimals, door, control, pair fullness — make 5,184 combinations. A strength-2 array holds all 258 pairs in 63 rows, a strength-3 array all 1,636 triples in 168, each row under one assertion: settle inside the floors or refuse with a selector of ours. Zero took a third way.

Português — Dez factores que um fixture fixa antes de um swap — família do local, hops, pernas, posição da ponte, imposto de transferência, decimais, porta, controlo, plenitude do par — dão 5,184 combinações. Um array de força 2 contém todos os 258 pares em 63 linhas, um array de força 3 todos os 1,636 triplos em 168, cada linha sob uma única asserção: liquidar dentro dos pisos ou recusar com um selector nosso. Zero seguiram uma terceira via.

Español — Diez factores que un fixture fija antes de un swap — familia de la sede, saltos (hops), tramos, posición del puente, impuesto de transferencia, decimales, puerta, control, plenitud del par — dan 5,184 combinaciones. Un arreglo de fuerza 2 contiene los 258 pares en 63 filas, uno de fuerza 3 los 1,636 tríos en 168, cada fila bajo una sola aserción: liquidar dentro de los suelos o rechazar con un selector nuestro. Cero tomaron una tercera vía.

Français — Dix facteurs qu’un fixture fixe avant un swap — famille de place, sauts (hops), branches, position du pont, taxe de transfert, décimales, porte, contrôle, complétude de la paire — font 5,184 combinaisons. Un tableau de force 2 contient les 258 paires en 63 lignes, un de force 3 les 1,636 triplets en 168, chaque ligne sous une seule assertion : régler à l’intérieur des planchers ou refuser avec un sélecteur à nous. Zéro a pris une troisième voie.

Deutsch — Zehn Faktoren, die ein Fixture vor einem Swap festlegt — Handelsplatzfamilie, Hops, Legs, Brückenposition, Transfersteuer, Dezimalstellen, Tür, Kontrolle, Vollständigkeit des Paares — ergeben 5,184 Kombinationen. Ein Feld der Stärke 2 enthält alle 258 Paare in 63 Zeilen, eines der Stärke 3 alle 1,636 Tripel in 168, jede Zeile unter einer einzigen Zusicherung: innerhalb der Untergrenzen abrechnen oder mit einem unserer Selektoren ablehnen. Null nahmen einen dritten Weg.

Русский — Десять факторов, которые фикстура задаёт перед свопом — семейство площадки, хопы, ноги, позиция моста, налог на перевод, десятичные знаки, дверь, контроль, полнота пары — дают 5,184 комбинации. Массив силы 2 содержит все 258 пар в 63 строках, массив силы 3 — все 1,636 троек в 168, каждая строка под одним утверждением: рассчитаться внутри полов или отказать нашим селектором. Ноль пошли третьим путём.

Türkçe — Bir fixture’ın bir takas öncesinde sabitlediği on etken — borsa ailesi, sıçramalar (hops), bacaklar, köprü konumu, transfer vergisi, ondalık basamaklar, kapı, kontrol, çiftin doluluğu — 5,184 bileşim eder. Güç-2 bir dizi 258 ikilinin tümünü 63 satırda, güç-3 bir dizi 1,636 üçlünün tümünü 168 satırda tutar; her satır tek bir savın altında: tabanların içinde kapat ya da bize ait bir seçiciyle reddet. Sıfır tanesi üçüncü bir yol tuttu.

العربية — عشرة عوامل يثبّتها التجهيز (fixture) قبل أي مبادلة — عائلة المنصة، والقفزات (hops)، والأرجل، وموضع الجسر، وضريبة التحويل، والمنازل العشرية، والباب، والتحكم، وامتلاء الزوج — تعطي 5,184 تركيبة. مصفوفة من القوة 2 تحوي الأزواج الـ258 كلها في 63 صفًا، ومصفوفة من القوة 3 تحوي الثلاثيات الـ1,636 كلها في 168، وكل صف تحت تأكيد واحد: التسوية داخل الحدود الدنيا أو الرفض بمُحدِّد من عندنا. صفر سلكت طريقًا ثالثًا.

हिन्दी — स्वैप से पहले एक फ़िक्स्चर जो दस कारक तय करता है — वेन्यू परिवार, हॉप, लेग, ब्रिज की स्थिति, ट्रांसफ़र टैक्स, दशमलव, दरवाज़ा, नियंत्रण, जोड़े की पूर्णता — मिलकर 5,184 संयोजन बनाते हैं। शक्ति-2 का एक ऐरे सभी 258 युग्मों को 63 पंक्तियों में रखता है, शक्ति-3 का ऐरे सभी 1,636 त्रिकों को 168 में, हर पंक्ति एक ही अभिकथन के अधीन: न्यूनतम सीमाओं के भीतर निपटान करो या हमारे अपने सिलेक्टर के साथ मना करो। शून्य ने तीसरा रास्ता लिया।

日本語 — スワップの前にフィクスチャが固定する十個の要因 — 取引所ファミリー、ホップ数、レグ数、ブリッジ位置、送金税、小数桁、ドア、制御、ペアの充足度 — は 5,184 通りの組み合わせになる。強度2の配列は 258 組の対をすべて 63 行に、強度3の配列は 1,636 組の三つ組をすべて 168 行に収め、各行はただ一つの表明の下にある。下限の内側で決済するか、当方の selector で拒否するか。第三の道を取ったものはゼロだった。

中文 — 夹具在一次兑换前固定的十个因素 — 场所族、跳数 (hops)、腿数、桥的位置、转账税、小数位、门、控制、交易对的完整度 — 共有 5,184 种组合。强度为 2 的数组把全部 258 个二元组装进 63 行,强度为 3 的数组把全部 1,636 个三元组装进 168 行,每一行只受一条断言约束:在下限之内结算,或者用我们自己的 selector 拒绝。走第三条路的有零个。

한국어 — 스왑 전에 픽스처가 고정하는 열 가지 요인 — 거래소 계열, 홉 수, 레그 수, 브리지 위치, 전송세, 소수 자릿수, 문, 제어, 페어 충족도 — 은 5,184가지 조합을 만든다. 강도 2 배열은 258개의 쌍 전부를 63행에, 강도 3 배열은 1,636개의 삼중 전부를 168행에 담으며, 각 행은 단 하나의 단언 아래에 있다. 하한 안에서 정산하거나, 우리 쪽 selector로 거절하거나. 제3의 길을 택한 것은 0건이었다.

Bahasa Indonesia — Sepuluh faktor yang dikunci sebuah fixture sebelum swap — keluarga bursa, hop, leg, posisi jembatan, pajak transfer, desimal, pintu, kendali, kepenuhan pasangan — menghasilkan 5,184 kombinasi. Larik kekuatan 2 memuat seluruh 258 pasangan dalam 63 baris, larik kekuatan 3 seluruh 1,636 triple dalam 168, setiap baris di bawah satu asersi: selesaikan di dalam batas bawah atau tolak dengan selector milik kami. Nol yang menempuh jalan ketiga.

বাংলা — সোয়াপের আগে একটি ফিক্সচার যে দশটি নিয়ামক স্থির করে — ভেন্যু পরিবার, হপ, লেগ, ব্রিজের অবস্থান, ট্রান্সফার কর, দশমিক ঘর, দরজা, নিয়ন্ত্রণ, জোড়ার পূর্ণতা — মিলে 5,184টি সমাবেশ তৈরি করে। শক্তি-2 অ্যারে 258টি জোড়ার সবকটিকে 63 সারিতে ধরে, শক্তি-3 অ্যারে 1,636টি ত্রয়ীর সবকটিকে 168 সারিতে, প্রতিটি সারি একটিমাত্র দাবির অধীনে: নিম্নসীমার ভিতরে নিষ্পত্তি করো, নয়তো আমাদের নিজস্ব selector দিয়ে প্রত্যাখ্যান করো। তৃতীয় কোনো পথ নিয়েছে শূন্যটি।

Filipino — Sampung salik na inaayos ng isang fixture bago ang isang swap — pamilya ng venue, hops, legs, posisyon ng tulay, transfer tax, desimal, pinto, kontrol, kabuuan ng pares — ay gumagawa ng 5,184 na kombinasyon. Ang strength-2 na array ay naglalaman ng lahat ng 258 pares sa 63 hanay, ang strength-3 na array ng lahat ng 1,636 triple sa 168, bawat hanay sa ilalim ng iisang assertion: mag-settle sa loob ng mga sahig o tumangging may selector na sa amin. Zero ang tumahak sa ikatlong daan.

What you gain from this page is a criterion the usual ones do not give you. Statement, branch and condition coverage index the code; mutation indexes an injected fault; property tests index relations over inputs. None of them indexes the state a fixture fixes before the call — whether the input token is a bridge coin, whether control has been renounced, whether the pair is already full. A predicate over such a regime cannot vary inside a test, so no amount of input variation reaches its other value, and condition coverage reports it covered because the line ran. The covering array is the instrument that reaches it.

Stacked bars of the regime covering arrays at strength 2 and 3: settled, refused, not constructible; no third way
Every generated row settles inside the floors or refuses with a selector of ours: 53 / 4 / 6 at strength 2, 158 / 10 / 0 at strength 3, no third outcome in either. Source: regimes-covering.json, regimes-covering-t3.json.

The ten factors

The generator enumerates ten regime factors. Their product is the denominator every row of this article is measured against.

factorvaluescount
venue familyV2, V3, Solidly3
hops1, 2, 33
legs per hop1, 22
input token is a registered bridgeplain, bridge2
intermediate token is a registered bridgeplain, bridge2
fee-on-transfer shapenone, pull-only, every transfer3
input token decimals18, 62
doorcalldata route, solve-in-transaction, Permit23
controllive, renounced2
pair is fullopen, full2

Source: regimes-covering.json (factors, full_factorial 5,184, pairs 258, rows 63) and regimes-covering-t3.json (tuples 1,636, rows 168)

Three times three times two, and so on through the list, is 5,184 combinations. Running them all is not the point — most of the 5,184 differ from a neighbour in one factor whose interaction with the rest has already been seen. The combinatorial-testing result behind covering arrays is that most interaction faults involve a small number of factors, so an array that holds every pair, or every triple, of factor values exercises the interactions that matter at a small fraction of the full factorial.

Every pair, every triple

A strength-2 covering array is a set of rows such that, for any two factors, every combination of their values appears in at least one row. Ten factors with the value counts above have 258 such pairs, and covering_array.py holds all of them in 63 rows. A strength-3 array does the same for any three factors: 1,636 triples, held in 168 rows. The pairwise file is byte-identical to before the triple array was added — the two arrays are two denominators, not one replacing the other — and the generated file is checked against its generator in CI, so the array cannot drift from the factors it claims to cover.

What strength three adds is interactions of three factors that no pair reaches: a fee-on-transfer token entering a three-hop route through the planned door, a six-decimal input on a full pair under renounced control. Each row is one fixture through one harness, test/regime/RegimeHarness.sol, judged by one assertion.

One assertion, three outcomes, and what a third way means

Every row either settles — the delivered amount equals the recipient’s balance delta, is at least the floor the Router emitted, and nothing is left on the Router — or it is refused with a selector of ours. A panic, a foreign selector, an under-delivery or a stranded balance is a third way, and fails the row. That single assertion is what makes the array a measurement rather than a smoke test: a row is not allowed to “pass” by reverting for a reason nobody named.

strengthrowstuples heldsettledrefused, oursnot constructiblethird way
263258 pairs53460
31681,636 triples15810 — SolverE(5) ×7, RouterE(13) ×300

Source: ASSURANCE.md §4h–§4h.1; SWAP-TESTS-REPORT-2026-09.md §6; forge test --match-contract RegimeCoverageTest -vv and RegimeCoverageT3Test -vv

The four pairwise refusals are two families: the planner has no bridged path to build, and a route the executor declines. The ten refusals at strength three are the same two families. The six pairwise rows that cannot be built — the pull-only-taxed token has no six-decimal form — are printed by name and count against the denominator; they are not skipped, because a row silently dropped is a pair silently unmeasured. At strength three, zero rows are unconstructible.

What the array’s first run made explicit

The first run pinned a frame the parity tests had held on one side only. The floor the Router enforces equals the attested floor when the protocol fee comes off the output, and sits inside the interval from attested × (1 − fee) to attested when it comes off the input — the lower edge by the fee, the upper by the curve’s convexity. Both frames are now asserted on every row. That is what a regime instrument is for: not to find a defect, but to make every combination state which frame it is in.

What is outside the array

Reproduce

The check command regenerates both arrays from the factor lists and fails if the committed rows differ; the two forge commands run every row and print how each ended.

python3 .github/scripts/assurance/covering_array.py --check   # both arrays current against their generator
forge test --match-contract RegimeCoverageTest -vv              # 63 rows, every pair
forge test --match-contract RegimeCoverageT3Test -vv            # 168 rows, every triple

Do not trust this page — reproduce it

Every claim above is checkable against the chain. Start here:

git clone https://github.com/blazephoenixxyz-crypto/Blaze-Phoenix-Dex && cd Blaze-Phoenix-Dex && python3 .github/scripts/assurance/covering_array.py --check && forge test --match-contract RegimeCoverageT3Test -vv
Cite this article

Licensed CC BY 4.0 — quote, translate and reuse freely, including commercially, with attribution and a link. Copy a ready-made citation:

BlazePhoenix (2026). Covering arrays for regimes: every pair and every triple of ten factors, in 63 and 168 rows. BlazePhoenix Engineering. https://blazephoenix.xyz/learn/covering-arrays-for-regimes
@misc{blazephoenix_covering_arrays_for_regimes,
  title  = {Covering arrays for regimes: every pair and every triple of ten factors, in 63 and 168 rows},
  author = {BlazePhoenix},
  year   = {2026},
  url    = {https://blazephoenix.xyz/learn/covering-arrays-for-regimes},
  note   = {Accessed: reproduce the claim with the command above}
}

Writing an answer, a wiki entry or a paper? The claim above is reproducible against the chain before you quote it — which is the only sound basis for citing a technical source at all.

Contracts are verified on every chain we deploy to — addresses in the protocol manifest. Deeper formal treatment: the whitepaper (PDF). Standards cited: D. R. KUHN, R. N. KACKER, Y. LEI — PRACTICAL COMBINATORIAL TESTING, NIST SPECIAL PUBLICATION 800-142 (2010) — HTTPS://DOI.ORG/10.6028/NIST.SP.800-142

Related engineering

Next in Evidence standards · 4 / 8
Metamorphic relations: a second judge for the maths, and three bounds measured before they were written ›An oracle written from the same formula cannot catch the formula. Fourteen relations over the Core’s quote maths and five over the Solver’s plan ask instead how the output must move when the input moves.6 min

Questions, a partnership or a bug to report? Contact us or email contact@blazephoenix.xyz