ArexAi PR #44 contract-test CI output Run: https://github.com/ArexAiData/arexai-contracts/actions/runs/38347234101 Source: 9a635d4a814f43ec2333266d2d508f4774cf2693 Node: 22.13.0 191 named behavioral tests passed. Runner reports 194 passing entries because it also counts the three helper-only file executions listed in this output. These are not three additional security scenarios. One optional fork skipped. > arexai-contracts@1.0.0 test:consistency > node --test scripts/test-project-consistency.mjs TAP version 13 # Subtest: consistent recorded metadata passes without claiming live verification ok 1 - consistent recorded metadata passes without claiming live verification --- duration_ms: 34.853216 ... # Subtest: rejects wrong staking address ok 2 - rejects wrong staking address --- duration_ms: 34.821157 ... # Subtest: rejects wrong token address ok 3 - rejects wrong token address --- duration_ms: 31.208214 ... # Subtest: rejects APR drift ok 4 - rejects APR drift --- duration_ms: 30.33508 ... # Subtest: rejects wrong reward budget ok 5 - rejects wrong reward budget --- duration_ms: 29.733105 ... # Subtest: rejects historical reserve presented as current ok 6 - rejects historical reserve presented as current --- duration_ms: 31.337976 ... # Subtest: rejects wrong contribution budget ok 7 - rejects wrong contribution budget --- duration_ms: 30.331363 ... # Subtest: rejects wrong contribution Safe ok 8 - rejects wrong contribution Safe --- duration_ms: 29.93169 ... # Subtest: rejects wrong contribution threshold ok 9 - rejects wrong contribution threshold --- duration_ms: 30.389401 ... # Subtest: rejects wrong tranche count ok 10 - rejects wrong tranche count --- duration_ms: 30.381689 ... # Subtest: rejects test evidence mismatch ok 11 - rejects test evidence mismatch --- duration_ms: 30.575398 ... # Subtest: rejects wrong public trading date ok 12 - rejects wrong public trading date --- duration_ms: 30.764516 ... # Subtest: rejects APY or compounding substituted ok 13 - rejects APY or compounding substituted --- duration_ms: 29.96566 ... # Subtest: rejects audit falsely marked complete ok 14 - rejects audit falsely marked complete --- duration_ms: 29.410637 ... # Subtest: rejects wrong governance ok 15 - rejects wrong governance --- duration_ms: 30.341099 ... # Subtest: rejects obsolete README staking status ok 16 - rejects obsolete README staking status --- duration_ms: 29.950063 ... # Subtest: rejects unfunded listing status ok 17 - rejects unfunded listing status --- duration_ms: 29.986548 ... 1..17 # tests 17 # suites 0 # pass 17 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 590.123018 ##[group]Run npm run verify:ai-examples npm run verify:ai-examples shell: /usr/bin/bash -e {0} ##[endgroup] > arexai-contracts@1.0.0 verify:ai-examples > node scripts/verify-ai-examples.mjs && node scripts/verify-ai-period-fixtures.mjs Four synthetic reference fixtures verified: explicit durations/statuses, separate currencies, categorical analysis and exact-key reconciliation. Not a product/model test. Two v3.9.2 synthetic review fixtures verified: quality counts, calendar/date ambiguity, numeric contamination, units, original offsets and mixed contexts. Reference checks only; no application/model execution. Verified synthetic calls reference: 60 seconds, next 120, source A3, A5 Verified synthetic accounting reference: 200 EUR, next 400, source A3, A5 Verified synthetic inventory reference: 20 count, next 40, source A3, A5 Verified synthetic personnel reference: 14 hours, next 28, source A3, A5 Verified synthetic survey reference: 3 count, next 6, source A3, A5 Five period reference fixtures passed. This does not verify application mapping, UI, uploads/downloads, privacy, model accuracy or browser behavior. ##[group]Run npm run test:tooling npm run test:tooling shell: /usr/bin/bash -e {0} ##[endgroup] > arexai-contracts@1.0.0 test:tooling > node --test scripts/test-review-package.mjs TAP version 13 # Subtest: reviewer package accepts exact bytes and the expected clean commit ok 1 - reviewer package accepts exact bytes and the expected clean commit --- duration_ms: 35.760984 ... # Subtest: reviewer package rejects altered bytes ok 2 - reviewer package rejects altered bytes --- duration_ms: 32.70278 ... # Subtest: reviewer package rejects missing file ok 3 - reviewer package rejects missing file --- duration_ms: 31.768355 ... # Subtest: reviewer package rejects unexpected file ok 4 - reviewer package rejects unexpected file --- duration_ms: 31.88854 ... # Subtest: reviewer package rejects duplicate manifest path ok 5 - reviewer package rejects duplicate manifest path --- duration_ms: 34.68832 ... # Subtest: reviewer package rejects path traversal ok 6 - reviewer package rejects path traversal --- duration_ms: 32.937619 ... # Subtest: reviewer package rejects absolute path ok 7 - reviewer package rejects absolute path --- duration_ms: 31.913765 ... # Subtest: reviewer package rejects noncanonical path ok 8 - reviewer package rejects noncanonical path --- duration_ms: 31.425157 ... # Subtest: reviewer package rejects file symlink ok 9 - reviewer package rejects file symlink --- duration_ms: 31.807418 ... # Subtest: reviewer package rejects parent directory symlink ok 10 - reviewer package rejects parent directory symlink --- duration_ms: 31.106575 ... # Subtest: reviewer package rejects invalid hash ok 11 - reviewer package rejects invalid hash --- duration_ms: 30.929004 ... # Subtest: reviewer package rejects invalid size ok 12 - reviewer package rejects invalid size --- duration_ms: 41.141723 ... # Subtest: reviewer package rejects missing dirty-tree flag ok 13 - reviewer package rejects missing dirty-tree flag --- duration_ms: 32.555436 ... # Subtest: reviewer package rejects a different expected commit ok 14 - reviewer package rejects a different expected commit --- duration_ms: 32.145891 ... # Subtest: dirty packages remain inspectable but cannot pass the clean release gate ok 15 - dirty packages remain inspectable but cannot pass the clean release gate --- duration_ms: 64.032265 ... # Subtest: actual package builder produces verifiable hashes and refuses overwrite ok 16 - actual package builder produces verifiable hashes and refuses overwrite --- duration_ms: 173.049927 ... 1..16 # tests 16 # suites 0 # pass 16 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 763.740714 ##[group]Run npm run compile npm run compile shell: /usr/bin/bash -e {0} ##[endgroup] > arexai-contracts@1.0.0 compile > hardhat build Compiled 15 Solidity files with solc 0.8.24 (evm target: paris) ##[group]Run set -o pipefail set -o pipefail mkdir -p ci-evidence npm test 2>&1 | tee ci-evidence/contract-tests.txt node --version > ci-evidence/node-version.txt npm --version > ci-evidence/npm-version.txt git rev-parse HEAD > ci-evidence/commit-sha.txt shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} env: STAKING_LOAD_REPORT: ci-evidence/staking-load.json STAKING_BOUNDARY_REPORT: ci-evidence/staking-boundary.json STAKING_FROZEN_LOAD_REPORT: ci-evidence/staking-frozen-load.json STAKING_STATEFUL_REPORT: ci-evidence/staking-stateful.json ##[endgroup] > arexai-contracts@1.0.0 test > hardhat test nodejs No contracts to compile Running node:test tests - BSC fixed-block fork: six runtime sources, immutable links and local token transfer ✔ Deployed TeamVesting rejects zero addresses and invalid calendar schedules (342ms) ✔ Deployed TeamVesting retains the creation transaction's twenty dates and fixed destinations ✔ Deployed TeamVesting applies all twenty exact calendar boundaries ✔ Deployed TeamVesting rolls back underfunded release and recovers after funding ✔ Deployed TeamVesting permits public triggers, cumulative catch-up and no excess release ✔ LiquidityReserveVault rejects every zero-address constructor dependency ✔ LiquidityReserveVault exposes its fixed cap and immutable manager ✔ LiquidityReserveVault releases partial amounts only to its manager ✔ LiquidityReserveVault blocks non-owner releases ✔ LiquidityReserveVault rejects zero and cumulative over-allocation ✔ LiquidityReserveVault rolls state back when its token balance is insufficient ✔ LiquidityReserveVault permits the exact cap and rejects any later release ✔ LiquidityReserveVault ownership transfer requires pending-owner acceptance ✔ PresaleRound routes exact payment and delivers ARXAI immediately ✔ PresaleRound enforces minimum and cumulative wallet maximum ✔ PresaleRound consumes an exact payment-token approval ✔ PresaleRound rejects purchases before start and at the end timestamp ✔ PresaleRound pause control belongs only to the owner ✔ PresaleRound ownership transfer requires acceptance by the pending owner ✔ PresaleRound burns only the unsold allocation after the round ✔ PresaleRound rejects invalid constructor configuration ✔ PresaleRound rejects a purchase when sale-token inventory is insufficient ✔ PresaleRound returns an exact quote and restricts finalization to the owner ✔ PresaleRound rejects every zero-address constructor dependency ✔ PresaleRound rejects every invalid numeric constructor configuration ✔ PresaleRound rejects payment tokens with more than 18 decimals ✔ PresaleRound rejects a payment that rounds down to zero ARXAI ✔ PresaleRound rejects purchases beyond the configured allocation ✔ PresaleRound rejects finalization when unsold inventory is underfunded ✔ PresaleRound rolls state back when allowance is insufficient ✔ PresaleRound rolls state back when payment-token balance is insufficient ✔ PresaleRound rejects purchases after finalization ✔ PresaleRound finalizes without burning when the allocation is sold out ✔ PresaleRound allows only the pending owner to accept ownership ✔ PresaleRound documents the operational consequences of ownership renunciation ✔ PresaleRound enforces START-1, START, END-1 and END boundaries ✔ PresaleRound tracks maximum contributions independently per buyer ✔ PresaleRound rejects cumulative small purchases above the wallet maximum ✔ Recipient risk: blocked treasury rolls back payment, delivery, allowance and sale accounting ✔ Recipient risk: blocked buyer cannot pay and contributes nothing ✔ Pause policy: unpause within the original window resumes without extending the deadline ✔ Pause policy: unpause after end does not reopen the sale; finalization still burns unsold tokens ✔ Pause policy: owner may finalize an ended round while it remains paused ✔ Recipient risk: reserve ownership rotation does not redirect its immutable beneficiary ✔ Recipient risk: liquidity release rolls back its counter when the immutable manager is blocked ✔ Recipient risk: TeamVesting retains earned liability after a blocked beneficiary transfer ✔ Recipient risk: ArexAITeamVesting retains earned liability after a blocked beneficiary transfer ✔ ReserveVault rejects every zero-address constructor dependency ✔ ReserveVault exposes the fixed allocation and immutable destinations ✔ ReserveVault releases one exact tranche only to the beneficiary ✔ ReserveVault blocks non-owner releases ✔ ReserveVault rolls state back when a tranche is underfunded ✔ ReserveVault releases exactly twenty tranches and rejects a twenty-first ✔ ReserveVault ownership transfer requires acceptance by the pending owner ✔ Safe preflight rejects the getter-compatible test harness before treating it as genuine Safe ✔ Safe strict policy accepts a pinned synthetic configuration and rejects bypass settings ✔ Safe proxy evidence is pinned to official 1.4.1 and not the unrestricted harness ✔ /home/runner/work/arexai-contracts/arexai-contracts/test/staking-behavior.ts ✔ Staking boundary load preserves allocated claims despite another overdue boundary (921ms) ✔ Deadline queue matches an independent sorted model through root pruning and rescheduling (1163ms) ✔ Deadline queue enforces packed bounds, monotone deadlines and empty-root safety ✔ Frozen deployment load: delayed-30-days (509ms) ✔ Frozen deployment load: dense-1024 (9154ms) ✔ Frozen deployment load: exhaustion (2473ms) ✔ Frozen deployment load: emergency (1877ms) ✔ Development interleaving: delayed principal exit retains post-snapshot days and stops future accrual (235ms) ✔ Development interleaving: exhaustion scan permits allocated claims and exits without changing pro-rata shares (403ms) ✔ Development interleaving: exhaustion allocate permits allocated claims and exits without changing pro-rata shares (335ms) ✔ Development interleaving: emergency scan preserves mixed liabilities across exits, claims and delayed batches (293ms) ✔ Development interleaving: emergency allocate preserves mixed liabilities across exits, claims and delayed batches (344ms) ✔ Frozen mainnet interleaving: delayed principal exit retains post-snapshot days and stops future accrual (238ms) ✔ Frozen mainnet interleaving: exhaustion scan permits allocated claims and exits without changing pro-rata shares (337ms) ✔ Frozen mainnet interleaving: exhaustion allocate permits allocated claims and exits without changing pro-rata shares (344ms) ✔ Frozen mainnet interleaving: emergency scan preserves mixed liabilities across exits, claims and delayed batches (326ms) ✔ Frozen mainnet interleaving: emergency allocate preserves mixed liabilities across exits, claims and delayed batches (317ms) ✔ Staking seeded model 17: mixed users, terms, time, claims, exits and closure conserve balances (1280ms) ✔ Staking seeded model 2026: mixed users, terms, time, claims, exits and closure conserve balances (831ms) ✔ Staking seeded model 64091: mixed users, terms, time, claims, exits and closure conserve balances (1025ms) ✔ Staking seeded model 2638: mixed users, terms, time, claims, exits and closure conserve balances (1096ms) ✔ Staking load: 1 positions settle in bounded batches and unlock withdrawal ✔ Staking load: 64 positions settle in bounded batches and unlock withdrawal (579ms) ✔ Staking load: 256 positions settle in bounded batches and unlock withdrawal (2430ms) ✔ Frozen mainnet: Staking rejects EOAs as governance, requires full funding and has immutable rates ✔ Frozen mainnet: Staking quotes all agreed terms using a 365-day simple APR ✔ Frozen mainnet: Staking allows independent deposits without a 5M cap and protects holder ownership ✔ Frozen mainnet: Locked staking early exit returns principal only and recycles the entire reserved reward ✔ Frozen mainnet: All locked terms pay their fixed reward at maturity and stop accruing afterwards ✔ Frozen mainnet: Flexible staking has no first-day reward and supports claims without resetting its clock ✔ Frozen mainnet: Flexible exit before 24h pays only principal ✔ Frozen mainnet: Exhausted flexible allocation is pro rata independent of claim order and locked promises survive ✔ Frozen mainnet: Bounded checkpoints freeze mutation and anyone may complete settlement ✔ Frozen mainnet: Emergency closure needs two harness approvals and permanently burns only surplus ✔ Frozen mainnet: Emergency flexible reward remains daily, preserves prior claims and protects delayed withdrawals ✔ Frozen mainnet: Direct donations never enlarge the reward cap ✔ Frozen mainnet: Recycled locked rewards reopen admissions without paying the flexible paused interval ✔ Frozen mainnet: Zero-rounded flexible positions do not enlarge daily checkpoint work ✔ Frozen mainnet: More than one batch of positions closes without an unbounded transaction (412ms) ✔ Frozen mainnet: Staking emergency with no positions burns the entire reward cap immediately ✔ Frozen mainnet: Principal-only flexible exit is immediate, stops accrual and never pays principal twice ✔ Frozen mainnet: Principal exits and allocated claims cannot invalidate either checkpoint pass (96ms) ✔ Frozen mainnet: Early locked principal exit remains forfeited if emergency happens before reward cleanup ✔ Frozen mainnet: Emergency principal exits preserve locked and flexible cutoff rewards and the burn budget ✔ Frozen mainnet: Principal exit during exhausted pro-rata allocation preserves both holders' reward shares ✔ Frozen mainnet: Locked maturity withdrawal is independent of other holders' overdue flexible boundaries ✔ Frozen mainnet: A day completed between checkpoint snapshot and principal exit stays scheduled for allocation ✔ Frozen mainnet: Inactive deadline entries are pruned once without accrual or aggregate-rate drift ✔ Frozen mainnet: Locked mode 1 withdrawal at maturity -1s uses the exact reward boundary ✔ Frozen mainnet: Locked mode 1 withdrawal at maturity 0s uses the exact reward boundary ✔ Frozen mainnet: Locked mode 2 withdrawal at maturity -1s uses the exact reward boundary ✔ Frozen mainnet: Locked mode 2 withdrawal at maturity 0s uses the exact reward boundary ✔ Frozen mainnet: Locked mode 3 withdrawal at maturity -1s uses the exact reward boundary ✔ Frozen mainnet: Locked mode 3 withdrawal at maturity 0s uses the exact reward boundary ✔ Frozen mainnet: Flexible claims reject a foreign holder and repeated payment without altering liabilities ✔ Frozen mainnet: Exhausted multi-holder allocations are identical for batches of 1 and 64 (84ms) ✔ Development Safe 1.4.1: real Safe rejects one signature without changing staking or nonce ✔ Development Safe 1.4.1: real Safe executes two signatures and rejects their replay ✔ Development Safe 1.4.1: real Safe rejects an outsider signature paired with an owner ✔ Development Safe 1.4.1: real Safe rejects two copies of one owner signature ✔ Development Safe 1.4.1: emergency preserves active principal and cutoff rewards before burning surplus ✔ Frozen mainnet Safe 1.4.1: real Safe rejects one signature without changing staking or nonce ✔ Frozen mainnet Safe 1.4.1: real Safe executes two signatures and rejects their replay ✔ Frozen mainnet Safe 1.4.1: real Safe rejects an outsider signature paired with an owner ✔ Frozen mainnet Safe 1.4.1: real Safe rejects two copies of one owner signature ✔ Frozen mainnet Safe 1.4.1: emergency preserves active principal and cutoff rewards before burning surplus ✔ Development Safe 1.5.0: real Safe rejects one signature without changing staking or nonce ✔ Development Safe 1.5.0: real Safe executes two signatures and rejects their replay ✔ Development Safe 1.5.0: real Safe rejects an outsider signature paired with an owner ✔ Development Safe 1.5.0: real Safe rejects two copies of one owner signature ✔ Development Safe 1.5.0: emergency preserves active principal and cutoff rewards before burning surplus ✔ Frozen mainnet Safe 1.5.0: real Safe rejects one signature without changing staking or nonce ✔ Frozen mainnet Safe 1.5.0: real Safe executes two signatures and rejects their replay ✔ Frozen mainnet Safe 1.5.0: real Safe rejects an outsider signature paired with an owner ✔ Frozen mainnet Safe 1.5.0: real Safe rejects two copies of one owner signature ✔ Frozen mainnet Safe 1.5.0: emergency preserves active principal and cutoff rewards before burning surplus ✔ Sparse deadlines: only two due positions are visited among 1,026 queued positions (5688ms) ✔ Dense 1,024-position normal settlement uses one pass; emergency and simultaneous exits conserve rewards (11236ms) ✔ 1,024-position exhaustion falls back to proportional allocation independent of claim order (10402ms) ✔ Staking differential model 17: 256 operations match independent ledger and frozen deployment (18413ms) ✔ Staking differential model 2026: 256 operations match independent ledger and frozen deployment (17924ms) ✔ Staking differential model 64091: 256 operations match independent ledger and frozen deployment (16081ms) ✔ Staking differential model 2638: 256 operations match independent ledger and frozen deployment (17918ms) ✔ Staking differential model 3735928559: 256 operations match independent ledger and frozen deployment (19229ms) ✔ Staking differential model 2654435769: 256 operations match independent ledger and frozen deployment (16808ms) ✔ Staking differential model 324508639: 256 operations match independent ledger and frozen deployment (16931ms) ✔ Staking differential model 38177486: 256 operations match independent ledger and frozen deployment (17482ms) ✔ Development: Staking rejects EOAs as governance, requires full funding and has immutable rates ✔ Development: Staking quotes all agreed terms using a 365-day simple APR ✔ Development: Staking allows independent deposits without a 5M cap and protects holder ownership ✔ Development: Locked staking early exit returns principal only and recycles the entire reserved reward ✔ Development: All locked terms pay their fixed reward at maturity and stop accruing afterwards ✔ Development: Flexible staking has no first-day reward and supports claims without resetting its clock ✔ Development: Flexible exit before 24h pays only principal ✔ Development: Exhausted flexible allocation is pro rata independent of claim order and locked promises survive ✔ Development: Bounded checkpoints freeze mutation and anyone may complete settlement ✔ Development: Emergency closure needs two harness approvals and permanently burns only surplus ✔ Development: Emergency flexible reward remains daily, preserves prior claims and protects delayed withdrawals ✔ Development: Direct donations never enlarge the reward cap ✔ Development: Recycled locked rewards reopen admissions without paying the flexible paused interval ✔ Development: Zero-rounded flexible positions do not enlarge daily checkpoint work ✔ Development: More than one batch of positions closes without an unbounded transaction (432ms) ✔ Development: Staking emergency with no positions burns the entire reward cap immediately ✔ Development: Principal-only flexible exit is immediate, stops accrual and never pays principal twice ✔ Development: Principal exits and allocated claims cannot invalidate either checkpoint pass (100ms) ✔ Development: Early locked principal exit remains forfeited if emergency happens before reward cleanup ✔ Development: Emergency principal exits preserve locked and flexible cutoff rewards and the burn budget ✔ Development: Principal exit during exhausted pro-rata allocation preserves both holders' reward shares ✔ Development: Locked maturity withdrawal is independent of other holders' overdue flexible boundaries ✔ Development: A day completed between checkpoint snapshot and principal exit stays scheduled for allocation ✔ Development: Inactive deadline entries are pruned once without accrual or aggregate-rate drift ✔ Development: Locked mode 1 withdrawal at maturity -1s uses the exact reward boundary ✔ Development: Locked mode 1 withdrawal at maturity 0s uses the exact reward boundary ✔ Development: Locked mode 2 withdrawal at maturity -1s uses the exact reward boundary ✔ Development: Locked mode 2 withdrawal at maturity 0s uses the exact reward boundary ✔ Development: Locked mode 3 withdrawal at maturity -1s uses the exact reward boundary ✔ Development: Locked mode 3 withdrawal at maturity 0s uses the exact reward boundary ✔ Development: Flexible claims reject a foreign holder and repeated payment without altering liabilities ✔ Development: Exhausted multi-holder allocations are identical for batches of 1 and 64 (114ms) ✔ team allocation unlocks in 20 exact monthly five-percent tranches ✔ team vesting rejects zero token and beneficiary addresses ✔ team vesting exposes valid tranche times and rejects an invalid index ✔ team vesting reports its funding state accurately ✔ team vesting rejects release when an unlocked tranche is underfunded ✔ any caller can trigger release but funds always go to the beneficiary ✔ team vesting handles exact schedule boundaries and cumulative catch-up ✔ ArexAI rejects a zero treasury ✔ ArexAI mints the fixed supply once to the configured treasury ✔ ArexAI holders can burn only their own balance ✔ ArexAI burnFrom requires and consumes holder allowance ✔ ArexAI exposes no owner, mint, pause, blacklist or upgrade entry points ✔ ArexAIToken verified source rejects a zero initial holder and has no privileged supply controls ✔ ArexAIToken conserves balances and burned supply through a reproducible mixed operation sequence (373ms) ✔ ArexAIToken failed delegated burns preserve supply, balance and allowance ✔ /home/runner/work/arexai-contracts/arexai-contracts/test/helpers/frozen-staking.ts ✔ /home/runner/work/arexai-contracts/arexai-contracts/test/helpers/staking-security.ts 194 passing (203365ms) 1 skipped