Skip to content

Brief 01 · The case for

Do small keys move before USDC does?

Each brief below asks one question, answers it in one sentence generated from the results file, and shows the exact query, its bytes scanned and its dates. The pass rule was registered on chain first; the case against is published with the same weight.

The claim did not hold

Out of sample, function-call keys did not forecast weekly USDC volume better than daily active accounts or price. The data is complete and the test ran exactly as registered; the thesis failed it, and Keytell publishes that.

BRIEF 1.1Evidence for

Does function-call activity rise before USDC volume does?

The claim did not hold: over 94 out-of-sample weeks of one-step forecasts of weekly USDC volume, adding function-call-signed activity to an AR(2) baseline added 5.1 percent to forecast error; daily active accounts added 3.6 percent to forecast error; price added 5.5 percent to forecast error. The pass rule needs function-call activity to do better than both.

1101001K10K100K2024-012025-012026-01in-sample startsout-of-sample startsUSDC volumeNEAR priceFC-signed txDAA

Source: BigQuery crypto_near_mainnet_us (transactions, ft_events) through 2026-11-08; FC share from the keyless block sample; price from Coin Metrics. Indexed to 100 on 2023-10-16, log scale.

Sampler: scripts/sample-chain.tsTest: analysis/method.py
Show the SQL sql/04_daa.sql153.7 GB scanned
04_daa.sql
Purpose: daily transaction count and daily active accounts (distinct transaction signers).
Tables: bigquery-public-data.crypto_near_mainnet_us.transactions
Range: block_date between @start and @end (in-sample 2022-01-03 to 2024-12-29; out-of-sample
       2024-12-30 to 2026-11-08), always filtered on the partition column.
Dry-run bytes: 88.4 GB in-sample, 65.3 GB out-of-sample (153.7 GB for both, measured 13 Nov 2026).

SELECT
  block_date,
  COUNT(*) AS transactions,
  COUNT(DISTINCT signer_account_id) AS active_accounts
FROM `bigquery-public-data.crypto_near_mainnet_us.transactions`
WHERE block_date BETWEEN @start AND @end
GROUP BY block_date
ORDER BY block_date
  • 2022-01-03 to 2024-12-29: 88.40 GB, 1092 rows, output sha256 28ac5201fa56558b..., ran 2026-11-13T18:08:38+00:00
  • 2024-12-30 to 2026-11-08: 65.29 GB, 679 rows, output sha256 1d84d952522bc37a..., ran 2026-11-13T18:18:07+00:00
Show the SQL sql/05_usdc_volume.sql26.1 GB scanned
05_usdc_volume.sql
Purpose: the primary outcome. Daily USDC moved on NEAR by NEP-141 ft_transfer events, native USDC
         (contract id from Circle's documentation) and bridged USDC.e, counting the receiving side
         of each transfer once (positive deltas only), successful events only.
Tables: bigquery-public-data.crypto_near_mainnet_us.ft_events
Range: block_date between @start and @end (partition column).
Dry-run bytes: 20.3 GB for 2022-01-03 to 2026-11-08 (measured 13 Nov 2026).

SELECT
  block_date,
  contract_account_id,
  COUNT(*) AS transfers,
  CAST(SUM(SAFE_CAST(delta_amount AS BIGNUMERIC)) / 1000000 AS FLOAT64) AS usdc
FROM `bigquery-public-data.crypto_near_mainnet_us.ft_events`
WHERE block_date BETWEEN @start AND @end
  AND contract_account_id IN (
    '17208628f84f5d6ad33f0da3bbbeb27ffcb398eac501a31bd6ad2011e36133a1',
    'a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.factory.bridge.near')
  AND cause = 'ft_transfer'
  AND status LIKE 'SUCCESS%'
  AND SAFE_CAST(delta_amount AS BIGNUMERIC) > 0
GROUP BY block_date, contract_account_id
ORDER BY block_date, contract_account_id
  • 2022-01-03 to 2024-12-29: 6.52 GB, 923 rows, output sha256 11114cec14860e42..., ran 2026-11-13T18:08:31+00:00
  • 2024-12-30 to 2026-11-08: 19.54 GB, 1358 rows, output sha256 94324072aa6e842d..., ran 2026-11-13T18:18:03+00:00
BRIEF 1.2Evidence for

How much does each signal improve the one-step forecast?

Versus DAA the mean squared-error difference is 0.006578 (95 percent interval -0.055139 to 0.069399); versus price -0.001606 (-0.060525 to 0.05815). Negative favours function-call keys; the pass rule needs both intervals below zero.

0 = no better than AR(2)FC-signed transactionslag 4 wk, headline-5.1%FC sharelag 4 wk-7.7%Daily active accountslag 4 wk, baseline-3.6%Transaction countlag 3 wk1.8%NEAR pricelag 3 wk, baseline-5.5%

Source: Expanding-window one-step forecasts over 94 out-of-sample weeks (2024-12-30 to 2026-11-02); gain = 1 - SSE(model)/SSE(AR(2)); each candidate at its best in-sample lag. data/out/results.json

Test: analysis/method.pyErrors: data/out/oos_errors.csv
BRIEF 1.3

Where did it win and where did it lose?

Running total of the per-week difference in squared forecast error. A line that falls means function-call activity forecast better than the baseline over those weeks; a line that rises means it did worse. Losses are not smoothed away.

-3.00-2.00-1.000.001.002.002025-012025-042025-072025-102026-012026-042026-072026-10FC minus DAAFC minus price

Source: data/out/oos_errors.csv: per-week one-step errors for each model, out-of-sample weeks only.

Errors: data/out/oos_errors.csv
BRIEF 1.4

Which lag did the in-sample window choose, and how sure was it?

The lag for each signal was chosen on in-sample weeks only, as the one with the largest reduction in squared error over AR(2). Out-of-sample weeks never touched this choice.

Signallag 1lag 2lag 3lag 4lag 5lag 6lag 7lag 8
fc_signed_tx0.0%0.5%1.2%5.6%0.0%2.5%1.9%0.0%
fc_share0.0%0.4%0.2%8.3%0.3%2.3%2.1%0.0%
daa0.7%2.7%1.1%3.7%0.4%0.4%0.0%1.5%
tx_count0.6%0.2%4.5%0.1%3.4%0.8%0.1%0.0%
price0.1%0.0%9.9%0.3%0.5%2.7%0.0%1.4%

Source: data/out/lags.csv, in-sample 2023-10-16 to 2024-12-23.

Lags: data/out/lags.csv
BRIEF 1.5

Do the signals and USDC volume move together, lag by lag?

Lagged Spearman rank correlations between each signal's log change k weeks earlier and the log change in USDC volume, with moving-block bootstrap 95 percent intervals. Descriptive only; the pass rule uses forecast error.

SignalWindowk=1k=2k=3k=4k=5k=6k=7k=8
fc_signed_txin sample0.08 [-0.19, 0.33]0.06 [-0.25, 0.45]0.14 [-0.20, 0.46]-0.31 [-0.57, -0.12]0.26 [0.00, 0.54]-0.06 [-0.33, 0.29]-0.17 [-0.42, 0.12]0.20 [-0.08, 0.43]
fc_signed_txout of sample0.12 [-0.07, 0.29]-0.10 [-0.33, 0.12]0.15 [-0.06, 0.36]-0.04 [-0.32, 0.20]-0.18 [-0.41, 0.10]0.15 [-0.03, 0.32]0.01 [-0.21, 0.24]-0.04 [-0.31, 0.22]
daain sample0.02 [-0.28, 0.24]0.10 [-0.12, 0.35]0.11 [-0.18, 0.38]-0.19 [-0.39, 0.01]0.10 [-0.13, 0.28]-0.14 [-0.42, 0.19]-0.07 [-0.30, 0.14]0.23 [-0.02, 0.38]
daaout of sample0.09 [-0.07, 0.25]-0.06 [-0.26, 0.08]0.06 [-0.14, 0.23]0.13 [-0.03, 0.29]-0.08 [-0.25, 0.12]-0.14 [-0.35, 0.04]0.11 [-0.10, 0.32]0.04 [-0.13, 0.18]
pricein sample-0.04 [-0.36, 0.20]0.04 [-0.23, 0.27]0.11 [-0.12, 0.37]-0.25 [-0.41, -0.04]0.04 [-0.24, 0.35]-0.15 [-0.39, 0.16]0.06 [-0.15, 0.27]0.12 [-0.10, 0.34]
priceout of sample0.13 [-0.04, 0.25]0.01 [-0.20, 0.18]-0.14 [-0.31, 0.03]0.10 [-0.05, 0.30]-0.05 [-0.22, 0.16]-0.04 [-0.24, 0.18]0.04 [-0.14, 0.26]0.04 [-0.10, 0.21]

Source: data/out/correlations.csv

Correlations: data/out/correlations.csv
BRIEF 1.6

What share of NEAR transactions do function-call keys sign?

In 2026-W45, 29.5 percent of sampled mainnet transactions were signed by a function-call key (95 percent interval 23.6 percent to 36.2 percent); 35.5 percent were meta transactions relayed for a user.

0.0%10%20%30%40%50%2023-012024-012025-012026-01in-sample startsout-of-sample startsupper 95%FC shareDirect FC onlylower 95%

Source: Keyless block sample: 15,180 blocks, 50,600 transactions classified at signing time, 12,752 archival key lookups. Wilson 95 percent intervals (ignore block clustering, so a lower bound on width).

Sampler: scripts/sample-chain.tsClassifier: scripts/lib/classify.ts
BRIEF 1.7

Can a sample of 60 blocks a week be trusted?

The sample's weekly transaction estimate lands within 7.8 percent of the BigQuery census in the median week.

020M40M60M80M2023-012024-012025-012026-01CensusSample estimate

Source: Sampled estimate: transactions in 60 random blocks scaled by the week's height range. Census: BigQuery transactions table (sql/04).

Show the SQL sql/04_daa.sql153.7 GB scanned
04_daa.sql
Purpose: daily transaction count and daily active accounts (distinct transaction signers).
Tables: bigquery-public-data.crypto_near_mainnet_us.transactions
Range: block_date between @start and @end (in-sample 2022-01-03 to 2024-12-29; out-of-sample
       2024-12-30 to 2026-11-08), always filtered on the partition column.
Dry-run bytes: 88.4 GB in-sample, 65.3 GB out-of-sample (153.7 GB for both, measured 13 Nov 2026).

SELECT
  block_date,
  COUNT(*) AS transactions,
  COUNT(DISTINCT signer_account_id) AS active_accounts
FROM `bigquery-public-data.crypto_near_mainnet_us.transactions`
WHERE block_date BETWEEN @start AND @end
GROUP BY block_date
ORDER BY block_date
  • 2022-01-03 to 2024-12-29: 88.40 GB, 1092 rows, output sha256 28ac5201fa56558b..., ran 2026-11-13T18:08:38+00:00
  • 2024-12-30 to 2026-11-08: 65.29 GB, 679 rows, output sha256 1d84d952522bc37a..., ran 2026-11-13T18:18:07+00:00