Sai Teller
Saiはシステム全体を指す場合もありますが、この文書ではSai L1であるNibiru上のSai Wasmコントラクトを意味します。
Teller Depositでは、対応するソースチェーンの預入をSaiが認識し、決済前にその持分を取引に使用できます。Direct Depositでは、ユーザーがSai L1上に保有するSai USDCを預け入れます。担保は呼び出しと同時に到着します。
以下の用語は、ソースチェーン上の資金、決済前にSaiが付与するクレジット、決済時に届くSai USDC担保を区別します。Sai USDC1はBaseハブに保管されたUSDCに裏付けられています。このハブが対応するソースチェーンとSai L1であるNibiruを接続します。
定義の後に預入と配分の例を読み、決済状態と持分の場所が別々に変わることを確認してください。後半ではコントラクトの呼び出しとストレージを説明します。SVG内の技術ラベルは英語です。
| 用語 | 定義 |
|---|---|
| Teller Deposit | Tellerを通じて受理した個別のソースチェーン預入です。ルートIDとソース預入インデックスで識別し、決済後も同じ識別情報を保持します。 |
| Direct Deposit | ユーザーがSai L1であるNibiru上に保有するSai USDCをSaiへ預け入れる操作です。呼び出しと同時に担保が届くため、Saiは裏付けのある預入残高を直ちに増やします。 |
| Teller Deposit Credit | 検証済みのソース預入証拠をSaiが受理し、そのTeller Depositに対して取引可能だが出金できない持分を付与する操作です。この呼び出しは担保を送らず、Sai USDCも発行しません。 |
| 未決済のTeller Deposit | Teller Deposit Creditを付与済みで、Saiが裏付け担保をまだ適用していない預入です。ソース取引自体は確認済みの場合があります。 |
| 決済済みのTeller Deposit | Saiが裏付け担保を受け取り、適用した後の同じ預入です。その持分は引き続きオープンポジション内に存在できます。 |
| 決済 | 届いた担保を適用して、既存のTeller Deposit Creditを裏付ける操作です。元本全額が必要です。二重に信用を付与したり、ポジションを閉じたりしません。 |
| ソースチェーンのUSDC | Baseなどの対応するソースチェーンでCircleが発行するUSDCです。 |
| Sai USDC | TellerシステムのBase保管庫にロックされたUSDCを表すNibiru上のERC20トークンです。FunTokenの対応付けにより、ERC20とSaiのWasmコントラクトが使用するバンクデノムを相互変換します。 |
| 元本 | Teller Depositの当初の預入額です。取引しても、決済時に必要な額は変わりません。 |
| 持分 | 手数料、損益、ポジション変更を反映した、あるTeller Depositに帰属する価値です。未使用の場合とポジションに配分された場合があります。 |
| 未使用の持分 | ポジションへの配分に使用できる持分です。未決済なら出金できません。決済後に残った未使用分は裏付けのある預入残高へ加算します。 |
| 配分 | ポジションの持分のうち、特定のTeller Depositに帰属する額を記録する会計上のリンクです。預入キーと持分額を保持し、別のトークンやユーザー残高ではありません。 |
| 預入残高 | Sai内にある、裏付け済みかつ未使用の資金の合計です。オープンポジションの持分や未決済のTeller持分とは別です。 |
| 繰延効果 | ソースTeller Depositの裏付け担保を待つ、記録済みの手数料または送金義務です。決済時に記録した会計変更を適用し、送金メッセージを発行します。 |
| アテスター | ソース証拠を検証して署名する主体です。Saiはルートで承認された署名者の集合に照らして署名を検証します。 |
| オペレーター | ルートのTeller Deposit Creditまたは決済トランザクションを送信する権限を持つアカウントです。コントラクト所有者も送信できます。この権限は必要なアテスター署名の代わりにはなりません。 |
| ルート | ソースチェーンID、Tellerコントラクトアドレス、ソースUSDCアドレスの組です。設定にはアテスター、上限、一時停止状態などを含みます。 |
Teller Deposit Creditは、独自の制限を持つ別の資金提供機能であるSaiのUSDC取引クレジットプログラムとは異なります。同じ設定済みUSDC担保インデックスを使いますが、残高と会計は別です。
Sai USDCの裏付けとTellerの決済
Section titled “Sai USDCの裏付けとTellerの決済”TellerシステムはBaseの保管庫に裏付けUSDCを保持し、それを基にNibiru上でSai USDCを発行します。ユーザーはSai USDCを保有、送金、Saiへ預入できます。既存のSai USDCをSaiへ移しても総供給量は増えません。
Teller Deposit CreditはSai USDCを発行しません。 検証済みソース証拠に対して取引可能な持分を記録します。その後、決済で対応するSai USDCのバンク担保をSaiへ届けて適用します。トークン全体の裏付けとSai内の個別預入の決済は別の会計です。
TradeモードはSaiへ、Bridgeモードはユーザーのウォレットへ資金を送ります。ウォレットで受け取ったSai USDCを後でSaiへ入れる操作は、取得元がTellerでもDirect Depositです。
同じ預入の状態が変わり、持分は移動できる
Section titled “同じ預入の状態が変わり、持分は移動できる”AliceのTeller Depositの元本は300 USDCです。200をポジションXへ配分し、100を未使用で残します。決済は元本300を供給します。未使用100は裏付け済み預入残高へ加算し、ポジション内の200は裏付け済み持分として残ります。
| 属性 | 確認する内容 | 状態 |
|---|---|---|
| 決済状態 | Saiがこの預入の裏付け担保を適用したか | 未決済または決済済み |
| 持分の場所 | ユーザーが持分をどう使っているか | 未使用またはポジションへ配分済み |
この2つは独立しています。決済しても同じTeller Depositであり、決済済みと未決済の別々の預入には分裂しません。
手数料、損益、他の資金源を省略した例です。金額はUSDC単位で、決済時には対応するSai USDCのバンク担保を供給します。
Teller Deposit Creditの付与後は未決済持分で取引できます。出金は裏付け担保を適用する決済を待つ必要があります。
配分はポジションとTeller Depositを結ぶ
Section titled “配分はポジションとTeller Depositを結ぶ”1つのポジションで複数のTeller Depositを使用できます。Saiは各預入からの配分を個別に保持し、手数料、担保の返却、決済を追跡します。
預入Aが300、預入Bが100を持分400 USDCのポジションへ配分します。Bには未使用100もあります。Aだけが決済されると、ポジションは裏付け済み300と未決済100を含みます。Bの未使用100も未決済のままです。
決済後も配分は資金の帰属を示します。手数料やポジション変更で配分額は変わります。裏付け済みの未使用資金は預入残高に集約するため、決済済みの各Teller Depositに別々の未使用残高は保持しません。
未決済持分での取引には、担保の到着前に手数料や保管庫への送金義務が発生する場合があります。繰延効果がその義務を記録し、決済が会計変更を適用して送金メッセージを発行します。
Teller Deposit Creditと決済は別の呼び出し
Section titled “Teller Deposit Creditと決済は別の呼び出し”アテスターがソース証拠へ署名し、権限のあるオペレーターがTeller Deposit Creditを申請します。後で届く担保が同じ預入を裏付けます。その間もユーザーは取引できます。
CreditTellerDeposit → contract::execute → exec_credit_deposit
FundTradeMint + bank coins → contract::execute → exec_fund_trade_mint → settle_confirmed_range
SettleTellerBatch + bank coins → contract::execute → exec_settle_batch → settle_confirmed_rangeメッセージFundTradeMintには設定済みブリッジの権限が必要です。SettleTellerBatchはルートオペレーターまたは所有者が呼び出し、連続した預入範囲へ資金を供給できます。どちらも元本全額が必要で、決済順はルート内の信用付与インデックスに従います。
メッセージ名のMintは、Sai WasmコントラクトがSai USDCを発行したりポジションを開始したりする意味ではありません。ハンドラーは届いたバンク担保を会計処理します。
ブリッジ資金の処理経路
Section titled “ブリッジ資金の処理経路”ハンドラーは最初にCCTP預入の参照先を確認し、既存のTeller Deposit Creditを迂回した二重処理を防ぎます。
| CCTP参照先 | ソースチェーンのルート | 結果 |
|---|---|---|
| 既知の預入 | その預入のルートと一致する必要あり | 識別情報を検証して決済。不一致なら拒否。 |
| 未登録 | ルートあり | TellerDepositNotCreditedで拒否。信用付与後に再試行。 |
| 未登録 | ルートなし | 指定ユーザーの裏付け済み預入残高へ直ちに反映。 |
最後の分岐はDirect Depositと同じ内部関数を使用します。ただしこれはブリッジ資金の処理経路です。この文書のDirect Depositは、Sai L1上ですでに保有しているSai USDCを入れるユーザー操作を指します。
預入識別子とユーザー残高のキー
Section titled “預入識別子とユーザー残高のキー”ルートはソースチェーン、Teller、ソースUSDCを識別します。各Teller Depositはルート内のインデックスを持ち、ユーザーの持分合計は複数ルートをまとめます。
| 識別子 | 意味 |
|---|---|
| ルートID | ソースチェーンID、Tellerアドレス、USDCアドレスのハッシュ。 |
| Teller Depositキー | route_idとdeposit_idxの組。各ルート内で1から開始。 |
| ソース預入ID | ルート、預入インデックス、送信者、元本を結合。 |
| CCTP預入ID | 届いた資金とTeller Deposit Creditを結ぶ署名証拠の一部。 |
| ユーザーキュー番号 | 複数ルートにまたがるユーザーの預入順。0から開始し、ソース預入インデックスとは別。 |
マップUSER_TELLER_STATEはユーザーごとに1つのTellerUserStateを保存します。unsettled_idleとunsettled_in_tradesは持分の場所を、next_deposit_sequenceとdeposit_cursorはキューの進捗を記録します。キュー項目は別のマップUSER_TELLER_DEPOSIT_QUEUEに保持し、キュー全体を書き直さず個別に読み取りや削除を行います。会計ヘルパーは各操作内で最新のユーザー状態を読み、計算を検証して更新します。
関数teller_usdc_collateralはUSDC取引クレジットプログラムと同じ設定項目TRADING_CREDIT_COLLATERAL_IDXを読みます。ユーザー残高はユーザーのみ、キューはユーザーと番号をキーにします。このインデックスは設定値であり、全チェーン共通の固定番号ではありません。他の担保の取引や照会ではこの持分を使用できません。
名前空間はteller/route_cfgs、teller/depositsなどのteller/プレフィックスを使います。マイグレーション11が旧名前空間を移し、冗長な担保インデックスを除去し、4つの旧ユーザー値をTellerUserStateへまとめます。Rust型TellerTradeLotAllocation内のLotはTeller Depositを意味します。
参照資料と境界
Section titled “参照資料と境界”- Sai Keeper Teller構成はBase保管庫、Sai USDC、TradeとBridgeモードを説明します。
- Sai Tellerコードがこのページの会計とストレージ名の根拠です。
設定済みブリッジはDebitDepositToBridgeも呼び出せます。指定ユーザーの裏付け済み未使用残高を減らしてブリッジへ送るため、出金フローでのユーザー認可はブリッジが検証する必要があります。
Footnotes
Section titled “Footnotes”-
Sai USDCはNibiru USDCとも呼ばれます。 ↩