キーパー
24時間に1回、各トレジャリーの変換をトリガーし、続いてそのエアドロップをトリガーするオフチェーンのワーカーです。何も決定しません。そのループはデフォルトで5分ごとに周回し、2026-10-06以降は、エアドロップの時間枠ごとに1回、時間枠が閉じた後の最初の周回でボールトのETHを変換します。後述の「変換のペース」を参照してください。そのエアドロップのステップは、2026-10-05以降書かれています。後述を参照してください。
キーパーが行うこと
- 24時間に1回、年間を通じて米国市場の取引開始前である、デフォルトで13:00 UTCに時間枠が閉じた後、変換しきい値(デフォルトで0.1 ETH)以上を保有しているボールトを、閉じた後の最初の周回で見つけます。そのときしきい値を下回っているボールトは、その日のうちに取引によってしきい値を超えても、次の時間枠を待ちます。サイクルの購入は、その後に続く取引時間中に行われ、その送付は、デフォルトでは、その取引時間が終わった後に行われます。以前のサイクルからボールトに残っている資金(USDCまたはUSDG)は、しきい値に達しているかどうかにかかわらず、先へ進みます。6回目の監査ループ以降(2026-10-06)、ボールトのUSDCはそのETHの各変換の後に1回、それ以外の場合は時間枠ごとに最大1回、ミラーボールトのUSDGは周回ごとに進みます(「変換のペース」を参照)
- スワップのルートを提案し、最新の見積もりから最低額を計算します。2026-10-05以降、ボールトはそれらの最低額を、実際に届いた量に対して適用します。2026-10-06以降、Ethereum上の各ボールトは、作成時のルーターである自身のルーターで見積もられます
- 取引の場がボールトの許容幅の範囲内で約定できるよう、各ステップの規模を決めます(後述)
- 変換、ブリッジバッチ、そしてリモートチェーンでの購入を順に呼び出します。2026-10-05以降、ブリッジバッチを送れるのはキーパーだけです(
bridgeReady)。正規ブリッジのレールでは、バッチの手数料の見積もりを直近のベースフィーの2倍で求め(quoteBridgeAt)、超過分はキーパーに戻ってきます。9回目の監査ループ以降、キーパーが古いハブの見積もりに切り替えるのは、ハブ自身がその見積もりを持たないと答えた場合だけで、ノードが応答しない場合には決して切り替えません。応答がない場合、手数料がベースフィーに従う正規ブリッジのレールではアラートとともに、USDGのレールでは警告だけで、バッチは1周回待たされます。10回目の監査ループ以降(2026-10-06)、USDGのレールのバッチは、アダプターのマーケット数の上限(デフォルトで17)までしか運ばず、キーパーはその上限をバッチごとに読み取ります。最も長く待っているマーケットが先に送られ、その他のマーケットは次の周回までUSDCを自身のボールトに保持するため、いつまでも待たされるマーケットはありません(Robinhoodレールを参照してください)。それまでは、準備のできたすべてのマーケットが1つのバッチに入り、大きなバッチはその固定のcomposeのガスを使い果たすことがありました - 新しい各マーケットのミラーボールトを、その最初のバッチより前に、Robinhood Chain上で事前にデプロイします(
predeploy)。2026-10-05以降、これができるのはキーパーとStockFunのオーナーだけです。リモートハブはキーパーをバッチから知るため、最初のバッチより前は、StockFunのオーナーが最初のマーケットのボールトを事前にデプロイします。キーパーが事前にデプロイするのは、Robinhood Chain上のキーパーの鍵が、リモートハブがキーパーとして知っている鍵、またはリモートハブの管理者の鍵である場合だけです。キーパーがボールトを事前にデプロイできないマーケット(最初のバッチより前、リモートハブがまだ知らないキーパーの変更の後、または事前のデプロイが失敗した場合)は、アラートとともにバッチから外され、他のマーケットはブリッジを渡ります。その日にミラーボールトを読み取れないマーケットは、次のサイクルを待ちます。盲目的に送られたマーケットは、バッチ全体を失敗させることがありうるからです - 配信を監視します:届いていない送金、リプレイすべきチケット、まだデプロイされていないミラーボールト。出発時にRobinhood Chain上で測定できなかった送金は、リモートハブ自身のイベントによってのみ確認され、後から読み取った残高によって確認されることは決してありません。2026-10-06以降、正規ブリッジのレールでは、すべての送金がそのように確認されます。リモートハブは共通の資金から記録を支払うため、残高が別のバッチの資金によって増えることがあるからです。キーパーは、各送金の探索が止まった位置から、それらのイベントを数区間ずつ読み取ります。7回目の監査ループ以降(2026-10-06)、読み取るのはチェーンの最新ブロックより数ブロック手前までだけです。そのため、最新のブロックにあるイベントは、1〜2ブロック遅れたノードのせいで取りこぼされるのではなく、後のサイクルで読み取られます。8回目の監査ループ以降、キーパーは、ブリッジバッチを含むブロックがその数だけの深さになってから(
KEEPER_LOG_LAG_BLOCKS)、そのときに読み取り直したレシートに基づいて、そのバッチを追跡します。Robinhood Chain上のバッチの識別子はそのブロックから決まり、バッチを動かすようなEthereumの最新ブロックの再編成が起きると、キーパーは決して存在しない識別子を監視し続けることになっていたからです。10回目の監査ループ以降、期限内に計上されなかった送金についてのアラートは、USDGのレールでは、バッチのメッセージがRobinhood Chainのエンドポイントでどの段階にあるかを示します。まだそこに届いていない、composeされて計上がそれに続く、あるいは保存されている、のいずれかです。保存されている場合、そのUSDGはリモートハブにあり、誰かがより多くのガスで最後のステップを手作業で再実行するまでどこにも記録されず、アラートは保存されたメッセージのハッシュを示します。それまでは、アラートはリモートハブが記録しているものしか示さず、ガスの足りない最後のステップが資金をハブに残したとき、そのゼロは「何も着地していない」と読まれていました - 目にしたすべての緊急移転を、ただちにアラートのWebhookに中継します。対象は、すべてのボールト、ブリッジハブ、エアドロップのコントラクト、リモートハブ、すべてのミラーボールトです。10回目の監査ループ以降、監視するコントラクトをグループに分けて指定し、グループごとに1つのログリクエストを送ります。各リクエストが指定するアドレスとイベントの値は最大
KEEPER_LOG_MAX_SELECTORS個(デフォルトで1,000)で、あるブロックの範囲を通過するのは、そのすべてのグループが読み取られてからです。それまでは1つのリクエストがすべてを指定していたため、マーケットのレジストリがエンドポイントの受け付ける数(Robinhood Chainのノードではアドレスとイベントの値で2,000、Sepoliaの公開エンドポイントではアドレス9個)を超えると、すべてのリクエストが拒否され、緊急移転は二度と中継されなくなっていました - 10回目の監査ループ以降、各周回が必要とする各マーケットの情報(ボールトのETH、USDC、時間枠、債務、最後のエアドロップ)を、Multicall3を通じて1回の呼び出しで100マーケットずつ、それぞれの読み取りが単独で使っていたのと同じブロックで読み取ります。戻ってこない読み取りは、以前と同じように単独で行われ、決してゼロとは見なされません。それまでは、これまでに作成されたすべてのマーケットが、アイドルかどうかにかかわらず、周回のたびに1つずつ読み取りのコストを要し、2,000のアイドルなマーケットがあると、1回の周回が2回の周回の間隔と同じくらい長くかかっていました
- 正規ブリッジのレールでは、6回目の監査ループ以降、各バッチの2つのチケットを、その送金の計上に関係なく、それぞれが実行されたと分かるまで、取引時間中かどうかにかかわらず毎サイクル監視し、まだ有効なものをリプレイします。バッチの出発からデフォルトで6時間後(
KEEPER_TICKET_ALERT_HOURS)にも実行されたと分からないチケットには、一度だけアラートが出されます。期限の時点またはそれ以降に、実行が確認されないまま消えたチケットや、作成に失敗したチケットについても同様です。それまでは、キーパーはバッチのマーケットが計上された時点でそのバッチのチケットの監視をやめていたため、自動実行を逃した入金が失効するおそれがありました。7回目の監査ループ以降、キーパーは各チケットを、Arbitrum SDKと同じ順序で読み取ります。まずその作成のレシート、次にその自動実行、そして作成より前ではないブロックで、チケットがまだ存在するかどうかです。8回目の監査ループ以降、そのブロックは、最新ブロックより数ブロック手前のブロック(KEEPER_REMOTE_LOG_LAG_BLOCKS)、またはそれより作成のブロックが後であれば作成のブロックであり、エンドポイントのすべてのノードが持っているブロックです。2回の読み取りの間に作成された入金や、1ブロック違いの2つのノードに見られた入金が、まだ有効であるのに実行済みと見なされることは決してありません - ボールトで失敗が繰り返された後にアラートを出します。その際、ボールトのEthereum上のステップとRobinhood Chain上のステップを別々に数えるため、片側で毎日失敗するボールトは報告されます。7回目の監査ループ以降、キーパーはアラートのWebhookを最大10秒待ち、その応答を読み取ります。Webhookが受け取らなかったアラートは、最大100件まで状態ファイルに保持され、後のサイクルで再送されるため、届かないのではなく、遅れて届きます。メッセージには、SlackとDiscordがそれぞれ読み取るフィールドが含まれます。8回目の監査ループ以降、異なるアラートごとにエントリーは1つだけ保持されます。待機中に再び発生したアラート(毎サイクル失敗するボールト)は数えられ、二重に保持されることはありません。メッセージは、そのアラートが最初と最後に発生した時刻と回数を示し、遅れて届けられたアラートは、冒頭でそのことを示します。9回目の監査ループ以降、保持されたアラートは、最後に発生した順に送られます。再び発生したアラートは他のアラートの後ろに移るため、ある対象について最後に伝えられるのは、その最新の状態です(Webhookが停止している間に失敗し、回復し、再び失敗する監視は、以前は「回復済み」で終わっていましたが、今は最後に「失敗中」として届けられます)。100件を超えた場合に最初に捨てられるのは、その原因が続く間は毎サイクル発生するアラート(変換に失敗するボールト、失敗するブリッジバッチ)だけであるため、単発のアラート(たとえば緊急移転)と、各エピソードの最新の知らせが押し出されることは決してありません。10回目の監査ループ以降、エラーのテキストは、ログ、アラート、状態ファイルのいずれにおいても、RPCアドレスのスキームとホストだけを含み、それ以外の部分は決して含みません。プロバイダーがキーを置くのはその部分です
- 9回目の監査ループ以降、自身のトランザクションの1つがマイニングされた後の1分間、そのトランザクションが変えたものを、最新のブロックではなくそのトランザクションのブロックで読み取り、次に送るもののガスもそこで見積もります。その理由はテストネット実行で判明しました。同じ周回の変換の直後に送られたブリッジバッチが、負荷分散されたエンドポイントのうち変換より1ブロック遅れたノードでシミュレーションされ、ブリッジで送るものが何もないと判断して、偽のアラートを出したのです。そのブロックより遅れているノードは今ではエラーを返し、バッチは警告とともに1周回待ちます。また、EthereumのGlamsterdamアップグレードによってトランザクション内部の呼び出しが重くなったため、キーパーのすべてのトランザクションは、見積もったガスを1.25倍にして送られます
- 9回目の監査ループ以降、どの日付にも収まらない、チェーンから読み取った時刻(フィードの開始、時間枠の終了、チケットの期限)は、それに出会った読み取りを失敗させる代わりに、「an unknown time」と読まれます
- 7回目の監査ループ以降、最初のサイクルの前に、各RPCが設定で指定されたチェーンに対応していることを確認し、そうでなければ起動を拒否します。後で判明した誤ったチェーンは、アラートとともにそのチェーンの作業を止めます。識別子を読み取れないチェーンは待機し、もう一方のチェーンの作業は続きます。8回目の監査ループ以降、両方のチェーンIDを設定しなければならず(後述)、別のチェーンのために書かれた状態ファイルは、キーパーがRPCが対応しているチェーンを読み取るまで、手をつけずに残されます(「再起動」を参照)
- 8回目の監査ループ以降、Robinhood Chain上のミラーボールトのオラクルの、2つの価格フィードのガードを読み取ります。オラクルがシーケンサーのためにすべての価格を差し止めている間、リモートでの購入は1回のアラートとともに待機し、コーポレートアクションの最中の株式は単独で待機します(「オラクルが価格を差し止めるとき」を参照)
- 両方のレールで、リモートハブで待機している資金をスイープによって支払います:トークンが着地した記録と、ハブが一時停止している間にハブに届いた分です。USDGのレールでは、リモートハブが緊急移転についてStockFunのオーナーによる清算を待っている間はスイープを控え、そのことを一度だけ報告し、帳簿が清算されると再開します。2026-10-05以降は、ミラーボールトが拒否した取り分も、そのボールトが再び資金を受け取るようになった時点でスイープします。正規ブリッジのレールでは、そのスイープを、何かを支払う場合にだけ送ります
BuybackBurnerをトリガーします。その際、フック上に計上されたバイバック残高も含めて数えます。この残高は、バーナーが購入の前に引き取ります- 時間枠ごとに1回、デフォルトでは米国の取引時間の後に、各マーケットの株式をエアドロップのコントラクトへ送ります。ただし、配分を設定することは決してありません。後述を参照してください
- 2026-10-05以降、取引時間に関係なく毎サイクル、フックと流動性のロックが、受け取りを拒否した受取人のために保持している分を支払います:フックがマーケットのボールトに対して負っている分(
payTreasury)と、ロックがボールトまたはクリエイターのために保持している手数料の回収の取り分(payOwed)です。各支払いはまずシミュレーションされ、何かを支払う場合にだけ送られます。どちらの呼び出しも、誰でも行えます - 2026-10-05以降、LP手数料付きで作成されたプールのLP手数料を、プールごとに1日最大1回回収します(
collectFees。誰でも呼び出せます)。StockFunのプールはデフォルトではLP手数料を課さないため、デフォルトでは回収するものはありません
変換のペース
創業者は2026-09-27に、ボールトのETHは日次サイクルごとに1回、エアドロップの直前に、その確認の時点でボールトがしきい値を保有している場合にだけ変換すると決定しました。キーパーは2026-10-06以降これを守っています。それまでは、ボールトがしきい値を保有した時点で、取引時間中の周回のたびにボールトのETHを変換していました。
- 時間枠。サイクルとはエアドロップの時間枠のことです。時間枠は、エアドロップのコントラクトが示す時刻に閉じます(デフォルトでは13:00 UTCに閉じる24時間)。
$STOCKFUNのマーケットも含みます。ファクトリーがエアドロップのコントラクトを指定していない間は、そのデフォルトのスケジュールに従います - 時間枠ごとに1回の確認。ループは引き続きデフォルトで5分ごとに周回し、各周回はサイクルのレポートで終わります。しきい値は、時間枠が閉じた後にそのボールトに到達する最初の周回で確認されます。しきい値以上であれば、ETHは一度だけ変換されます。ボールト自身が記録している直近のETHの変換がチェーンから読み取られ、後の周回にそれを伝えるため、再起動しても何も変わりません。しきい値を下回る場合、その日のうちに取引によってしきい値を超えても、ETHは次の時間枠を待ちます。キーパーはこの確認を状態ファイルに保持します。2026-10-06以降は、それを自身の時計の時刻ではなく、確認の対象となった時間枠の終了時刻として保持します。時間枠が閉じる前後で少しずれた時計では、その時刻がチェーンの時間枠からずれることがありえたからです。古いキーパーが書き込んだ確認は数えられないため、アップグレードの時間枠では、そのようなボールトはもう一度確認されます。6回目の監査ループ以降、確認は時間枠が閉じた後のボールトの残高を読み取ります。以前は、閉じる時刻をまたいで実行された周回が、閉じる前に読み取った残高を記録していたため、期限内にしきい値を超えたボールトがその時間枠を飛ばしていました
- 確認の時点で実行できない変換(ETH/USDのフィードが更新されない、取引の場がボールトの許容幅の範囲内で約定できない、トランザクションが失敗する、キーパーが時間枠を読み取れない)は、同じ時間枠の後の周回で再試行されます。キーパーが読み取れない時間枠はETHのステップの失敗として数えられ、失敗が繰り返された後にアラートが出されますが、ボールトのUSDCは引き続き動きます
- 6回目の監査ループ以降のUSDC。ボールトにすでにあるUSDCは、しきい値に関係なく、独自のペースで先へ進みます。Ethereum上でのその購入、またはブリッジバッチへのその放出は、ボールトのETHの各変換の後に1回、それ以外の場合(寄付、返金、失敗した、または半分にされたステップが残した分)は時間枠ごとに最大1回行われます。数えられるのは成功したステップだけで、失敗したステップは後の周回で再試行されます。こうして2026-09-27の創業者の決定はUSDCにも及びます。それまでは、各周回の前にボールトに送られた数単位のUSDCによって、キーパーは周回のたびに購入を、あるいは手数料を伴うブリッジバッチ全体を送っていました
- 周回ごとに行われるもの:Robinhood Chain上での購入。ミラーボールトの残高は配信と寄付を区別できず、各購入の上限は、大きな配信を意図的に複数の周回に分散させます。半分にされた変換が残すETH(取引の場が許容幅の範囲内で残高の全額を約定できなかったもの)は、次の時間枠を待ちます
- ローカルとテストネットの実行では、
KEEPER_CONVERT_ONCE_PER_WINDOWをfalseにし、その場合は周回ごとに変換、購入、ブリッジを行います。それ以外のすべての環境では、デフォルトどおりオンのままです
このページの他の箇所で「毎サイクル」と言う場合は、サイクルのレポートと同じく、ループの周回ごとを意味します。時間枠に当たるのは、エアドロップの日次サイクルだけです。
失敗は1つずつ
2026-10-05以降、コントラクトは、1つのレッグ、1つの株式、1つのマーケット、1つの配信が、他を止めることなく失敗できるようにし、失敗したものをイベントで報告します。キーパーはそれらのイベントを読み取り、解消されずに残るものについてアラートを出します。キーパー自身の作業も、同じように分割されています。
- 購入のレッグ。各株式のレッグは個別に計画されます。計画できないレッグはスキップされ、他のレッグは実行されます。ボールトが失敗を報告したレッグ(
LegFailed)は、その資金をその株式のために確保したままにします。キーパーはそれを変換済みとして数えることは決してなく、そのボールトでその株式が3回連続で失敗した後にアラートを出します(KEEPER_ALERT_AFTER_FAILURES)。ボールトのレッグを1つも計画できない場合は、以前と同様に、そのボールト全体が失敗します - ブリッジバッチの中のマーケット。ブリッジハブがバッチから外したマーケット(
MarketSkipped)は、後のバッチのために、そのUSDCを自身のボールトに保持します。3回連続でバッチから外されると(KEEPER_BRIDGE_ALERT_AFTER_SKIPS)、デコードされた理由とその対処法とともに、一度だけアラートが出されます。10回目の監査ループ以降、アダプターの上限によってバッチから外されたマーケットは、ログにその旨が記されて次の周回を待ち、そのバッチの先頭になります。アダプターが拒否したバッチ(上限を超えている、またはバッチの設定なしにアップグレードされたアダプター)については、理由とそのバッチ自身のマーケットを示してアラートが出されます - 拒否された配信。キャッシュレッグのトークンがミラーボールトへの受け渡しを拒否した取り分(
DeliveryRefused)については、リモートハブがそのマーケットにその分を何も負わなくなるまでの間に、その対処法とともに、一度だけアラートが出されます - 読み取れないボールト。たとえば壊れたアップグレードの後で、自身のビュー関数が応答しなくなったボールトは、そのサイクルから外され、他のボールトは変換を行います。3サイクル連続でそうなった後に、一度だけアラートが出されます(
KEEPER_ALERT_AFTER_FAILURES) - 残り続ける債務。ボールトが、あるいはクリエイターの取り分についてはフックが、自身に支払われるべきETHをまだ拒否している間、キーパーは、そのプールがStockFunのオーナー(修正のためのアップグレード)を待っていることを、エピソードごとに一度だけアラートで知らせ、債務がキーパーまたは他の誰かによって支払われた時点で、そのエピソードの終了をログに記録します
StockFunのオーナーにしか解決できないものは「管理者待ち」です。エピソードごとに1回のアラートで、失敗として数えられることは決してなく、その間も残りの処理は続きます。
サイクルのレポートには、支払われた債務とまだ未払いの債務、失敗したレッグ、LP手数料が回収されたプール、そしてエアドロップのステップについては、開かれたサイクル、実行された保留株式の探索、送付したボールト、まだ移動中の配信が加わります。2026-10-06以降、対象となる保有量のない時間枠への送付は、エアドロップのコントラクトが保留するため、送付したボールトとは別に数えられます(airdropHeldAside)。正規ブリッジのレールでは、送られたチケットのリプレイ(redeemed)と、まだ監視中のチケット(ticketsWatched)を数えます。7回目の監査ループ以降は、エアドロップへの送付がコストに見合うまで待機しているマーケット(airdropBelowCost)と、Webhookのために保持されているアラート(alertsUndelivered)も数え、チェーンの識別子がまだ確認されていない場合はそのことを示します(deferred: chain-unverified)。
オラクルが価格を差し止めるとき
2026-10-06以降、ミラーボールトのオラクルは価格を差し止めることがあり(Robinhoodレールを参照してください)、8回目の監査ループ以降、キーパーは、何かを見積もる前にそれを読み取ります。
- シーケンサー。サイクルごとに1回、キーパーは、シーケンサーのチェックが何を示しているかをオラクルに問い合わせます。シーケンサーが停止している間、復旧から猶予期間が経っていない間、またはそのアップタイムフィードを読み取れない間は、どの株式にも価格を付けられません。ボールトの購入は待機し、何も見積もられず、何も失敗として数えられません。1回のアラートがそのエピソードを開き、再起動によって再び発生しないよう状態ファイルに保持されます。そして、もう1回のアラートが購入の再開を知らせます。ChainlinkがRobinhood Chainのアップタイムフィードを公開するまで、このチェックはそのチェーン上ではオフであるため、現時点では、これはどれも起こりえません
- コーポレートアクション。トークンがオラクルを一時停止している株式は、あらかじめ購入から外され、そのことがログに記録され、そのUSDGはその株式のために保持されます。この株式が失敗のアラートに数えられることは決してなく、バスケットの他の株式は購入されます。キーパーの計画からその購入までの間に、その理由でボールトが失敗を報告したレッグも、想定どおりのものであり、やはり数えられません
- 理由を示す。ガードがレッグの価格を差し止めているためにそのレッグの許容幅を読み取れない場合、キーパーは、どちらのチェーンでも、レッグに価格を付けられないボールトとしてではなく、その理由をログに記録します。キーパーが読み取れないガード(ガード以前のオラクル)は何も差し止めません。以前と同様に、各レッグ自身の許容幅が決めます。9回目の監査ループ以降、オラクルのその他のエラーもデコードされます。古いフィードは、ログでも失敗したレッグの理由でも、デコードされていないコードではなく
StalePriceと表示されます
エアドロップのステップ
コントラクト側は2026-10-04以降、キーパーのステップは2026-10-05以降コード化されています。キーパーは毎サイクル、取引時間の確認の前に、まずすでに送られた配信を追跡します。続いて、ファクトリーがエアドロップのコントラクトを指定している間は、$STOCKFUNのマーケットも含め、各マーケットを順に処理します。
- 時間枠ごとに1回。ボールトは、その最後の送付(
lastAirdropAt)が、今送付すれば着地する時間枠の終了時刻(currentCycleEnd)と同時かそれより後であれば、その時間枠については完了しています。どちらもチェーンから読み取られるため、再起動しても何も変わりません。デフォルトでは、キーパーはその日の米国の取引時間が終わってから、ボールトが株式を保有している場合にだけ送付します。これにより、その日の購入は、その日に終わった時間枠へ、1回の送付で入ります。7回目の監査ループ以降、送るのは、送付のコストに見合う価値のある株式だけです(後述)。10回目の監査ループ以降、このデフォルトのもとでは、取引時間の終了後に読み取られ、送るもののなかったボールトは、次の取引時間が始まるか時間枠が変わるまで読み取り直されません。これは、購入がニューヨークの取引時間に従うレール(Ondoのレールを除く)でのことで、ボールトが保有するものは、取引時間中に行われるその購入から来るからです。ただし、ボールト自身の購入がまだレシートを待っている間は別で、レシートは夕方に着地することもあります。そのボールトは周回のたびに読み取られ、その購入がもたらすものは、その日に終わった時間枠に入ります - 送るものがなくても、保留された株式が先。マーケットが株式を保留していれば、それらが割り当てられる(割り当てによって、それらを受け取る時間枠のサイクルが開かれます)か、確認すべき終了済みの時間枠がなくなるまで、
assignUnassignedを1サイクルにつき最大5回呼び出します。2026-10-06以降、キーパーは、ボールトに送るものがあるかどうかにかかわらず、またボールトが一時停止しているかどうかにかかわらず、この探索を行います。それまでは送付の前にしか行われなかったため、一度取引されたきり静かになったマーケットは、新たな取引が起きるか、誰かが手作業で探索を行うまで、保留された最初のエアドロップをホルダーの手の届かないところに置いたままにしていました。探索が終わっていなければ、対象となる保有量のない時間枠への送付は次のサイクルに持ち越されます。6回目の監査ループ以降、ボールトに送るものがない間は、何も割り当てない探索(まだどの時間枠も株式を受け取れない)は、マーケットの探索が最新の時間枠からmaxWindowsPerAssign個(デフォルトで30)の時間枠だけ遅れたときにだけ送られます。いつまでも1日1回ではなく、1か月に1回の探索になります。株式を割り当てる探索は常に送られます。7回目の監査ループ以降、「送るものがない」とは、送付と同じルールで、送る価値のあるものがないことを意味します。ブリッジのレールでは、OFTが運べず、送付のたびにミラーボールトに残るダストは数に入らず、この制限はそこでも機能します - サイクル(送付の前にだけ)。
openCycleを呼び出し、各配信がサイクルに追加されるだけになるようにします。何も送られない時間枠については決して呼び出さず、7回目の監査ループ以降は、開始も含めてコストに見合う送付のためにだけ呼び出します。対象となる保有量のない時間枠はエラーではありません。その場合、株式は保留されます - 送付。ローカルのレールでは、マーケットの
TreasuryVaultのsendToAirdropを呼び出します。ブリッジのレールでは、ミラーボールトのsendToAirdropを呼び出し、見積もられたLayerZeroの手数料(quoteSendToAirdrop)にマージン(デフォルトで10 %)を加えて支払います。超過分はボールトが返金します。9回目の監査ループ以降、送付とそのすべての見積もりは、その配信がEthereum上で受け取るガスを運びます。そのガスはキーパーが選びます(後述)。この送付の前に、キーパーは、リモートハブがファクトリーのエアドロップのコントラクトへ送ること、各株式にアダプターがあり、そのアダプターが応答すること、そしてEthereum上のその株式のOFTがエアドロップのコントラクトに登録されていることを確認します。7回目の監査ループ以降、送付には、そのコストに見合う株式だけが載り、その手数料はそれらの株式について見積もり直されます - 配信。ブリッジのレールでは、各株式の配信を、Ethereum上のLayerZeroのエンドポイントが最後のステップを実行し終えるまで追跡します。この最後のステップが、エアドロップのコントラクトに計上します。9回目の監査ループ以降、そのエンドポイントで滞留した配信は、キーパー自身が再実行します(後述)。デフォルトで60分以内に計上されない配信は、1回のアラートを発生させます。そのアラートには、そのステップを手作業で実行するためのコマンドが含まれており、誰でもそれらを実行できます
各株式は個別に処理されます。残高を読み取れない株式(発行体による凍結)、アダプターがない株式やOFTが登録されていない株式、アダプターが応答しない株式(peers():そのアドレスにコントラクトがない、またはLayerZeroのアプリではない。2026-10-06以降。それまではマーケットの送付全体を失敗させていました)、8回目の監査ループ以降は、そのアダプターがLayerZeroの手数料を見積もれない株式(後述)、そしてボールトが送付できなかったと報告した株式(AirdropSendFailed)は、1回のアラートとともに外され、他の株式は送られます。各マーケットも個別に処理されます。失敗し続けるマーケットについては、3回連続で失敗した後に一度だけアラートが出され、次のマーケットの処理が続きます。2026-10-06以降、失敗し続ける保留株式の探索には専用のアラートがあり、その対処法を示します。誰でもそのマーケットについてassignUnassignedを呼び出せます。
ここでの「管理者待ち」は、一時停止中のエアドロップのコントラクト、緊急移転の後でエアドロップのコントラクトが不足している株式(その株式はボールトで待機し、他の株式は送られます)、ファクトリーのものとは別のエアドロップのコントラクトへ送るリモートハブ、そして9回目の監査ループ以降は、配信のガスの範囲が設定されていない、またはその上限が配信に必要な量を下回るリモートハブを対象とします。
送る価値のあるもの
7回目の監査ループ以降(2026-10-06)、キーパーは、送付のコストに見合う価値のあるものだけを送ります。それまでは、ゼロを超えるどの株式も送られていました。誰も取引しないマーケットのボールトにダストをわずかに上回る株式を贈ると、キーパーは毎日、その時間枠のサイクルを開き、LayerZeroのメッセージ、あるいはEthereumでの送付の代金を支払っていました。
- 送付が運ぶもの。残高を読み取ることができ、ゼロを超える株式です。ブリッジのレールでは、アダプターと、ゼロを超える自身の見積もりも必要です。ボールトの見積もりは、OFTが運べないダストについても、アダプターがその送付を見積もれない株式についても、同じくゼロになります。そのため、8回目の監査ループ以降、キーパーは、ボールトが組み立てるはずの送付について、その株式のアダプター自身に問い合わせます。ダストは決して送られず、アラートの対象にもなりません。見積もりが失敗する株式、つまりそれ自身の送付が失敗するはずの株式は、その理由を示す1回のアラートとともに外されます。そして、キーパーが問い合わせられない株式は、以前と同様に送られ、その送付が結果を決めます。それまでは、そのような株式はダストと見なされ、何の知らせもなくすべての送付から外されていました
- その価値。各株式は、そのボールト自身のオラクルで、その価格フィードの最新の回答によって、古いかどうかにかかわらず評価されます。これは推定であって、決して許容幅ではないからです。ETHで支払われるコストは、同じオラクルのETH/USDフィードでドルに換算されます
- それ自身のコスト。各株式は、少なくともそれ自身のコストに見合う価値がなければなりません。各株式がそれぞれ独立したメッセージであるブリッジのレールではそのLayerZeroの手数料、ローカルのレールでは送付のガスのうちその株式の分です。自身のメッセージに見合わない贈り物が、本物の送付に便乗して運ばれることは決してありません
- 送付全体。条件を満たした株式は、合わせて、送付全体と、時間枠のサイクルがまだ開かれていない場合はその開始(
openCycle)とに見合う価値がなければなりません。ローカルのレールでは、8回目の監査ループ以降、開始は一度だけ数えられます。サイクルが閉じている間に取られた送付自身の見積もりにすでにそれが含まれているため、加えられるのは開始のトランザクションの基本コストだけです。二重に数えると、コストをわずかに上回るだけの価値の送付が何日も差し止められていました。そうでなければどの株式も送られず、サイクルは開かれません - 待機するもの。送られなかったものはボールトに残り、その後に貯まる分とともに、後の時間枠で送られます。送付が待機しているマーケットは、サイクルのレポートで数えられ、時間枠ごとに1回ログに記録されます
- 読み取れないもの。キーパーが読み取れない価格、手数料、ガスのコストは、このルール以前と同様に、送付を通します。失敗した読み取りが本物の送付を差し止めることは決してありません
KEEPER_AIRDROP_MIN_VALUE_BPSがその倍率を設定します。デフォルトは10,000、つまりコストの1倍で、少なくともそのコストに見合う送付は、それを上回る規模にかかわらず送られます。より大きな値は、より小さな送付を、その倍率に見合うまで差し止め、0は運ばれるものをすべて送ります。同じルールが、前述の保留株式の探索について、ボールトに送るものがあるかどうかも決めます。監査はこれを推奨のデフォルトとして採用しました。このルールが決めるのは株式がいつ出ていくかだけで、量も、対象も、行き先も決めません。
Ethereum上での配信のガス
2026-10-06に、SepoliaがEthereumのGlamsterdamアップグレードを有効にしました。これにより、新しいストレージスロットのガスは以前のおよそ5倍になり、LayerZeroのテストネット実行の最初のサイクルのエアドロップ配信はすべて、LayerZeroのエグゼキューターでガスが尽きました。送付が支払っていたのは配信の最後のステップのガスだけで、その最初のステップのガスは、株式のLayerZeroアダプターのオーナー(メインネットでは発行体)が強制する値そのままだったのです。9回目の監査ループ以降、同日の創業者の決定に基づいて:
- キーパーは、送付の前に、各配信をEthereum上でシミュレーションします。配信を受け取る株式のトークンのコントラクトと、それを計上するエアドロップのコントラクトを、配信が出会うはずの状態でシミュレーションします。キーパーは、最も重い株式の必要量を1.25倍した値から、その株式のLayerZeroアダプターが最初のステップのためにすでに強制しているガスを差し引いた値を求めます
- シミュレーションを実行できない場合は、そのマーケットの直近の配信がEthereum上で使った値を、次にリモートハブのデフォルト値を使います
- リモートハブがそれを制限します。StockFunのオーナーは、2つのステップのそれぞれについて、デフォルト値、下限、上限を設定します(Robinhoodレールを参照してください)。キーパーが求める値は、すべてその間に収められます。上限によって配信の必要量より下に切り詰められた要求は「管理者待ち」です。送付はそれでも行われ、滞留した配信は再実行されます(次の節)
- ホルダーにとっては何も変わりません。キーパーが決めるのは配信に与えるガスだけで、送られる量も、行き先も、受取人も決して決めません
- 必要なときだけ選び直す。すべての株式のシミュレーションから選ばれた組は、株式、時間枠のサイクルの状態、配信が次の時間枠の終わりより後に着地しうるかどうかが変わらない間、その時間枠のあいだ保持されます。シミュレーションで得られなかった組は、周回のたびに選び直されます。10回目の監査ループ以降、ブリッジが運べないダストだけを運ぶ送付は、配信の環境を何も読み取りません。また、時間枠のサイクルが開いた後にシミュレーションされた組は、その状態が元に戻ることはないため、それを読み直すことなく再利用されます
Ethereum上で滞留した配信
ガスが不足した配信は何も失いません。その配信は、誰かがより多くのガスで再実行するまで、Ethereum上のLayerZeroのエンドポイントにとどまります。最初のステップが検証済みで未実行のまま、あるいは最後のステップが保存済みで未実行のままです。9回目の監査ループ以降、キーパーが自らそれを行います。
- キーパーは毎サイクル、エンドポイント上で各配信のステップを読み取ります。エグゼキューターの番が終われば(その失敗、ただしLayerZero自身のエグゼキューターからのものだけを信じます、または10分経過)、滞留したステップを、自身のEthereumの鍵から、シミュレーションした必要量を1.25倍したガスで、決して
KEEPER_AIRDROP_REEXECUTION_MAX_GAS(デフォルトで4,000,000)を超えずに再実行します - 送れないもの(シミュレーションが失敗する、必要量が上限を超える、鍵のETHが足りない)には、手作業で実行するためのコマンドを添えて1回だけアラートが出され、毎サイクル再試行されます
- チェーン上で再び失敗し、ステップが滞留したままのものが、2回目の失敗です。コマンドを添えてアラートが出され、キーパーが再び送ることは決してありません。キーパーがそう判断するのは、応答のあったステップの読み取りに基づく場合だけで、しかも失敗した実行のブロックが数ブロックの深さになってから(
KEEPER_LOG_LAG_BLOCKS)に限られます。そのため、1ブロック遅れたノードも、そのブロックの再編成も、キーパーに断念させることはできません - これらの実行の代金は、キーパーのEthereumの鍵が支払います。Glamsterdamのもとでは、サイクルを開く最後のステップにはおよそ100万ガスが必要です
キーパーが選ぶのは、タイミングと、オーナーが定めた範囲内での配信のガスだけで、それ以外は何も選びません。次に時間枠が閉じる時刻より後に到着した送付は、翌日の時間枠で測定されます。
このステップは7つの設定で動きます:KEEPER_AIRDROP(デフォルトでオン)、KEEPER_AIRDROP_AFTER_SESSION(デフォルトでオン。取引時間を無視するテストネットではオフ)、KEEPER_AIRDROP_FEE_MARGIN_BPS(1,000)、KEEPER_AIRDROP_TRANSIT_MINUTES(60)、7回目の監査ループ以降のKEEPER_AIRDROP_MIN_VALUE_BPS(10,000)、そして9回目以降のKEEPER_AIRDROP_REEXECUTION_MAX_GAS(4,000,000)とKEEPER_AIRDROP_LZ_EXECUTOR(空:キーパーのチェーン上のLayerZeroのエグゼキューター。キーパーが失敗のアラートを信じる唯一の呼び出し元です)です。
再起動:状態ファイル
2026-10-05以降、キーパーは、サイクルからサイクルへと追跡しているものを状態ファイル(KEEPER_STATE_DIR)に書き込みます:移動中のエアドロップの配信とブリッジの送金、レシートを待っているトランザクション、アラートのエピソード、そして連続した失敗の記録です。6回目の監査ループ以降は、キーパーが監視している正規ブリッジのレールのチケット、各送金の探索が止まった位置、各ボールトのUSDCが最後に進んだ時刻も含まれ、7回目以降は、Webhookがまだ受け取っていないアラートも含まれます。古いキーパーが書き込んだファイルは、そのまま読み込まれます。キーパーは、各サイクルと各送付の後にこのファイルを書き込み、起動時に一度だけ読み込みます。再起動しても、そのどれも失われません。再起動の後で最後のステップが失敗した配信にはやはりアラートが出され、再起動の前に送られたトランザクションが再び送られることは決してなく、すでにアラートが出されたエピソードについて二度アラートが出されることもありません。別のファクトリーのために書かれたファイルは脇に置かれ、キーパーは警告とともに空の状態で起動します。8回目の監査ループ以降、別のチェーンのために書かれたファイルは、キーパーがRPCが対応しているチェーンを読み取るまで、まずそのまま残され、読み込まれも上書きもされません。RPCが設定されたチェーンに対応していれば、そのファイルは別のチェーンのものであり、その時点で脇に置かれます。対応していなければ、誤っているのは設定された識別子であり、キーパーは起動を拒否し、それが修正されると、監視していた入金も含めて、自身のファイルを取り戻します。それまでは、識別子の入力ミスによって、キーパーが起動を拒否する前にファイルが失われていました。同じループ以降、保持されるアラートは、異なるアラートごとに1つです。古いキーパーが書き込んだファイルは、そのまま読み込まれます。9回目の監査ループ以降、ファイルには、各エアドロップ配信のパケットとキーパーによるその実行、そのマーケットの直近の配信が使ったガス、そして各正規チケットのキーパーによる最後のリプレイも保持されます。古いキーパーが書き込んだファイルは、引き続きそのまま読み込まれます。
2026-10-06以降:
- 各送付は、待機の前にディスクに書かれる。各トランザクションは、その直前にチェーンがキーパーのアドレスに与えるnonceで送られ、ハッシュが返ってきた時点で、レシートを待つ前に、そのハッシュとnonceとともに状態ファイルに書き込まれます。待機中に停止されたキーパーは、再起動時に、それを再送する代わりにそのハッシュから読み取ります
- 失われたトランザクションは手放される。送られてから
KEEPER_RECEIPT_ALERT_MSの4倍(デフォルトで2時間)が経ってもどのノードも知らないトランザクションは、1回のアラートとともに破棄され、同じ種類の送付を妨げなくなります。そのnonceは空いたままで、キーパーの次のトランザクションがそれを使います。まだマイニングされていないトランザクションについてのアラートは、それを置き換える方法を示します - 全体を書き込む。ファイルを受け入れられないほどディスクがいっぱいであることはエラーであり、アラートが出され、最後の正常なファイルが残ります。それまでは、途中で切れたコピーがそれを置き換えることがありえました
- フォルダーごとにキーパーは1つ。キーパーは状態フォルダーにロックファイルを置きます(
keeper.lock)。同じフォルダーの2つ目のキーパーは起動を拒否し、1つ目のキーパーを示します。キーパーがもう存在しないロックファイルは引き継がれますが、別のホストのキーパーが残したロックファイルは引き継がれず、そのキーパーがもう実行されていない時点で、オペレーターがそれを削除します。ドライランはロックファイルを置きません
各ステップの規模
2026-10-01以降、ボールトは残高の全額ではなく、キーパーが指定する金額を変換します。その規模はキーパーが次のように決めます。
| ステップ | 金額 |
|---|---|
| ETH → USDC | 残高の全額。見積もりがボールトの許容幅に届かない間は半分にしていくが、変換しきい値を下回ることはない。2026-10-06以降、残りは次の時間枠を待つ |
| Ethereum上のUniswapプールの株式 | その株式の確保分。最大4回まで半分にする。それでも届かないレッグは、確保分に手をつけないまま次のサイクルを待つ |
| 任意のOndoレールの株式 | その株式の確保分。セッションの名目金額の上限を超えない。2026-10-06以降、Ondoがボールトの許容幅を下回る価格を付けるレッグは決して送られない。無料の見積もりがアテステーションより前に読み取られ、アテステーションが許容幅を下回って返ってきた時点で、次の時間枠までその株式についてアテステーションは求められない |
| Robinhood Chain上の株式 | その株式の確保分。株式ごとに、固定の上限と、プールを測定できる場合はそのプールの深さの一定割合とによって制限する |
使われなかった分は、ボールトの中で次のサイクル(ETHについては次の時間枠)を待ちます。ある株式の資金は、その株式のために確保されたままです。
2026-10-01のセキュリティパイプライン以降、株式を購入するすべてのレールで、各購入はバスケットの最後の株式についてn−1単位を残します(nは株式の数)。ボールトはウェイトの丸めの端数を最後の株式に与えるため、キーパーの読み取りからそのトランザクションまでの間に数単位の資金が届くと、その1つの確保分が最大でn−2単位減ることがあります。読み取った金額をそのまま使うと呼び出し全体が失敗し、それは誰でもダストの送金によって引き起こせます。残した分は、次の呼び出しのために確保されたままです。ボールトを呼び出す他のものも、同じマージンを保つべきです。文書化された配分ルールを変更するコントラクト側の修正は、オーナーの決定を待っています。2026-10-06以降、そのわずかな単位のUSDCしか保有していないボールト(バスケットに含められる株式は最大5つなので、最大4単位)は、それらのためにはもう処理されません。それらは、そのETHがもたらす次のUSDCを待ちます。
$STOCKFUNのバーンも同じように規模が決められます。価格インパクトがキーパーの上限を超えるバーンの1回分は半分にされますが、キーパーのしきい値を下回ることはなく、残りは後のサイクルでバーンされます。2026-10-01のセキュリティパイプライン以降、$STOCKFUNのプールが全量を約定できない1回分も、同じく半分にされます。それ以前は、そのサイクルのバーンは失敗していました。それ以外の失敗は再試行されません。
キーパーにできないこと
バスケット外の資産を選ぶこと。ある株式のために確保された資金を別の株式に移すこと。オラクル許容幅を緩めること。コントラクトが送る先以外の場所に資産を送ること。何かを引き出すこと。誰がエアドロップを受け取るか、エアドロップがどれだけの量を運ぶかを選ぶこと、あるいは自分に取り分を割り当てること。
トリガーがキーパーに限定されているのはサンドイッチ攻撃を防ぐためであって、キーパーが信頼されているからではありません。キーパーが行うすべての呼び出しは、ボールトの許容幅の範囲内で実行されます。
サイクル
NYSEカレンダー} C -->|いいえ| W[待機] C -->|はい| P{コントラクトは一時停止中?} P -->|はい| W P -->|いいえ| A{この時間枠での
ボールトの最初の確認:≥ 0.1 ETH?} A -->|いいえ、ETHは
次の時間枠を待つ| N[次のマーケット] A -->|はい| E[ETH → USDC、50 bpsの許容幅] E --> B[USDC → USDG → ブリッジ] B --> R{リモートチェーンに到着?} R -->|いいえ| M[監視し、チケットをリプレイ] R -->|はい| K[株式を購入、200 bpsの許容幅] K --> AD[エアドロップのコントラクトへ送付] AD --> N
図中の時刻、しきい値、許容幅は、デフォルトの設定です。キーパーは5分ごとに周回します。ボールトのETHは、時間枠ごとに1回、閉じた後の最初の周回で確認され、ボールトがすでに保有しているUSDCは、各変換の後に1回、それ以外の場合は時間枠ごとに最大1回進みます。エアドロップのコントラクトへの送付は、時間枠ごとに1回、デフォルトでは取引時間の後に実行されます。債務、LP手数料、配信、そして6回目の監査ループ以降は正規ブリッジのレールのチケットが、取引時間に関係なく、毎サイクル処理されます。
設定
すべて環境変数で設定します。両チェーンのRPC、キーパーの秘密鍵、コントラクトアドレス、実行間隔、そして安全のためのレバー(ドライラン、1回だけ実行、市場のオープンを必須にする)です。2026-10-05以降は、さらに次のものもあります:上記のエアドロップのステップの設定、LP手数料の回収に関するKEEPER_COLLECT_FEES(デフォルトでオン)、KEEPER_COLLECT_FEES_HOURS(24)、KEEPER_COLLECT_FEES_MIN_WEI(0)、スキップが繰り返された後のアラートに関するKEEPER_BRIDGE_ALERT_AFTER_SKIPS(3)、そして状態ファイルのフォルダーであるKEEPER_STATE_DIRです。2026-10-06以降はKEEPER_CONVERT_ONCE_PER_WINDOW(デフォルトでオン)もあります。ボールトのETHは時間枠ごとに1回変換され、6回目の監査ループ以降は、そのUSDCが各変換の後に1回、それ以外の場合は時間枠ごとに最大1回送られます。ローカルまたはテストネットの実行ではこれをオフにし、周回ごとに変換、購入、ブリッジを行います。6回目の監査ループ以降はKEEPER_TICKET_ALERT_HOURS(6)もあります。正規ブリッジのレールで、実行されたと分からないチケットについてアラートが出されるまでの時間数です。KEEPER_STOCK_ROUTERは、ファクトリーが新しいボールトのために指定するルーターで、どのマーケットの取引時間がサイクルを制御するかを選ぶだけです。各ボールトは自身のルーターで見積もられます。
7回目の監査ループ以降、チェーンIDであるKEEPER_CHAIN_IDとKEEPER_REMOTE_CHAIN_IDは、最初のサイクルの前にRPCと照合されます。メインネットでは1と4663、テストネットでは11155111と46630です。8回目の監査ループ以降は両方を設定しなければなりません。KEEPER_CHAIN_IDは常に、KEEPER_REMOTE_CHAIN_IDはブリッジを使う場合に必要で、それらがなければキーパーは起動を拒否します(それまでは、省略すると、KEEPER_CHAIN_IDは11155111、KEEPER_REMOTE_CHAIN_IDは4663と読まれていました)。10回目の監査ループ以降、KEEPER_LOG_MAX_SELECTORS(デフォルトで1,000、最小5)が、1つのログリクエストが指定するアドレスとイベントの値の数を、Robinhood Chainのノードが数えるのと同じ方法で制限します。10個以上のアドレスを拒否するSepoliaの公開エンドポイントの背後では、10に設定されます。2つの設定が、ログ探索が最新ブロックの何ブロック手前で止まるかを決めます。KEEPER_LOG_LAG_BLOCKS(Ethereumで2)とKEEPER_REMOTE_LOG_LAG_BLOCKS(Robinhood Chainで12)です。8回目の監査ループ以降、前者は、キーパーがブリッジバッチを追跡する前にそのブロックがどれだけの深さになっていなければならないかも決め、後者は、チケットを最新ブロックの何ブロック手前で読み取るかも決めます。オラクルのガードには設定は必要ありません。キーパーは各ミラーボールトのオラクル上でそれらを読み取ります。空のままにした整数の設定はそのデフォルト値になり、範囲外の設定は起動時にキーパーを止めます。
キーパーの鍵はホットキーであり、ガス代のためだけに資金が入れられ、デプロイヤーの鍵とは別のものです。
限界
- USDGのレールでは、キーパーの起動前、またはキーパーが停止していた間に、キャッシュレッグのトークンが拒否した配信は、スイープの際に警告として表示されるだけです。正規ブリッジのレールでは、そのような取り分はリモートハブ自身の状態から見つかります
- 9回目の監査ループまでは、キーパーは、失敗した配信の最後のステップ(
lzCompose)を自ら実行しませんでした。それ以降は、滞留したステップを上限の範囲内で再実行し、2回目の失敗は、コマンドを添えて人の手に委ねられます - 緊急移転の監視は、再起動をまたいで読み取り位置を保持しません。キーパーが停止していた間に発行されたイベントはスキャンされません
- 送付から状態ファイルへの書き込みまでの数ミリ秒の間に停止されたキーパーは、再起動時にそのトランザクションをもう一度送ることがあります。そのような繰り返しの大半はコントラクト自身のチェックによって失敗し、そのガス代がかかります
- 送金の到着の探索は、同じブロックを二度読み取ることは決してありません。到着をすでに読み取ったブロックへ移すような再編成が起きた場合、その送金は移動中のアラートに委ねられます。7回目の監査ループ以降、すべてのログ探索は最新ブロックより数ブロック手前で止まるため、計上とその移動中のアラートは、その数ブロック分遅れます
- 8回目の監査ループ以降、ブリッジバッチは、そのブロックが数ブロックの深さになってから追跡されます。これは以前より1サイクル遅く、次のバッチはそれを待ちます。それより深い再編成は、ログ探索と同様に対象外です。最後の数ブロックの間に実行されたチケットは、最新ブロックがその実行からその数だけ進むまで、そこではまだ有効と読まれます。混雑したチェーンでは次のサイクル、閑散としたチェーンではさらに多くのサイクルです。9回目の監査ループ以降、キーパー自身のリプレイが削除したチケットは、その間、再起動の後も含めて、再びリプレイされることもアラートの対象になることもありません。それらのブロックの間に他の誰かがリプレイしたチケットは、再び試され、シミュレーションで失敗し、アラートの時間を過ぎると、まだ有効だとしてアラートが出されることがあります
- キーパーが自身の最後のトランザクションのブロックで読み取る1分間は、他のノードより1分以上遅れているノードをカバーしません
- ローカルのレールでは、時間枠の開始は一度だけ数えられ、2つ目のトランザクションが繰り返す分(コストのおよそ5 %)は含まれません。そのため、送付は、そのコストをその分だけ下回る価値で送られることがあります
- 10回目の監査ループ以降、取引時間の終了後に、いかなる購入とも関係なくボールトに渡された株式は、次の取引時間の送付とともに、後の時間枠に入ります。キーパーは、送るもののないボールトを次の取引時間になって初めて読み取り直すからです。取引時間の最後の周回でキーパーがレシートを読み取った購入が、取引時間の終了後の最初の周回で、それより遅れたノードから空として読まれることもありえますが、そのためには周回の間隔がそのノードの遅れ(Sepoliaではおよそ5秒)より短い必要があり、デフォルトの5分では決してそうなりません
プリフライト
本番の実行の前に、プリフライトコマンドが、トランザクションを1つも書き込むことなく、ネットワークが応答すること、アドレスにコードがあること、USDG OFTのLayerZeroのピアが一致していること、USDGがその発行体であるPaxosによって一時停止されていないこと、バスケットのウェイトが本来あるべき値であることを確認します。
8回目の監査ループ以降、プリフライトはオラクルのガードも確認します。そのマニフェストは、シーケンサーのチェックがどう設定されているかを、どちらの場合でも明示しなければなりません。アップタイムフィードも猶予期間もない(現在のようにチェックがオフ)か、猶予期間付きのフィードがあるかです。フィードがあればそれを読み取り、各株式のトークンのオラクル一時停止を読み取ります。コーポレートアクションの最中のトークンは警告であり、確認を失敗させません。そのシグナルを持たないトークンは失敗します。デプロイの後は、デプロイされたオラクルがマニフェストと一致していること、そのシーケンサーの状態が価格を通すこと、そしてすべての株式の一時停止チェックがオンであることを確認します。キーパーのinspectコマンドは、同じガードを出力します。シーケンサーのチェックとその状態、そして各株式の一時停止チェックと、そのトークンが今一時停止しているかどうかです。
9回目の監査ループ以降、プリフライトは、LayerZeroのテストネット実行のデプロイ(SepoliaとRobinhood Chainのテストネット)上でも、その実行の2つのファイルから、その組み合わせのために名前の付いたRPCを使って動作します。そのため、メインネットのRPCにテストネットについて問い合わせることは決してありません。それ以外のチェーンの組み合わせは、混在したものも含めて拒否されます。テストネットでは、そのチェーンにはないUniswap v3のルーターは読み取らず、ETH/USDのフィードを、その実行のオラクルに与えられたハートビートに照らして確認します。どちらの組み合わせでも、リモートのルーターが、マニフェストが示すv3のルーターを指定していることを確認します。テストネットのデプロイ上での実行:68件のチェックがすべて合格しました。
RPCがない場合は、誤った成功を報告するのではなく、実行を拒否します。