TreasuryVault
마켓당 볼트 하나. 모든 거래의 2 %를 받아 토큰화 주식으로 바꾸며, 이 주식은 토큰 홀더에게 에어드랍됩니다. 프로토콜에서 가장 무거운 컨트랙트이며, 권한은 가장 적은 컨트랙트입니다.
없는 것
withdraw가 없습니다. transfer가 없습니다. sweep이 없습니다. 오너가 없습니다. 이 함수들은
현재 구현 컨트랙트에 존재하지 않으며, 누구나 이를 검증할 수 있습니다: 호출할 대상이 없으므로
호출은 실패합니다. 2026-10-02부터 볼트 자체는 업그레이드할 수 있습니다: 아래를 참고하십시오.
전환 주기
- 누적. 거래와 함께 ETH가 들어옵니다. 24시간마다 한 번, 에어드랍 측정 구간이 닫힌 뒤 키퍼가 루프를 처음 돌며 확인할 때 볼트에 0.1 ETH 이상이 있으면 주기가 시작됩니다. 그보다 적으면 나중에 ETH가 임계값을 넘더라도 그날은 아무것도 실행되지 않습니다 — 가스비와 슬리피지가 작업을 잠식하기 때문입니다. 키퍼는 2026-10-06부터 이를 지킵니다; 그 전에는 볼트가 임계값을 보유하는 즉시 전환했습니다.
- ETH → USDC: Ethereum의 Uniswap v4에서 전환하며, ETH/USD 피드 대비 50 베이시스 포인트 한도가 적용됩니다. 깊은 페어이므로 한도를 좁게 잡을 수 있습니다. 키퍼가 금액을 지정하며, 그 금액은 최소 임계값, 최대 잔액 전체이고, 한도는 그 금액을 기준으로 계산됩니다.
- USDC → USDG: Curve를 통해 전환한 뒤, LayerZero 위의 Paxos OFT로 건너갑니다.
- 주식 매수: 미러 볼트가 Robinhood Chain의 세컨더리 풀에서 매수하며, 독립적인 Chainlink 피드 대비 200 베이시스 포인트 한도가 적용됩니다. 각 주식은 자신에게 배정된 현금으로 매수됩니다.
- 에어드랍. 같은 일일 주기 안에서, 키퍼는 매수된 주식을 Ethereum의 에어드랍 컨트랙트로 보내며, 토큰 홀더는 그곳에서 비례 배분으로 이를 청구합니다. 일곱 번째 감사 루프 이후로, 2026-10-06부터, 키퍼는 주식이 그 전송 비용만큼의 가치가 될 때 보냅니다; 그렇지 않으면 주식은 이후의 측정 구간까지 볼트에서 기다립니다.
볼트는 실제로 받은 양을 측정하고, 결과가 키퍼의 최소 수량에 미치지 못하면 거부하며, 이 최소 수량은 결코 한도보다 느슨하지 않습니다(2026-10-05부터; 그 전까지는 결과를 한도만으로 검사했습니다). 키퍼도, 레일도, 제시된 가격도 신뢰하지 않습니다.
2026-10-05부터 주식을 매수하는 두 볼트 모두에서 각 매수 레그는 따로 실행됩니다. 실패한 레그 —
되돌려지는 경로, 동결된 주식, 오래된 피드, 최소 수량에 못 미치는 결과, 거부된 호가, 그리고
2026-10-06부터 Robinhood Chain에서는 토큰이 기업 행위로 자신의 오라클을 일시 중지한 주식 — 는 그
현금을 그 주식에 배정된 상태로 유지하고 LegFailed를 발생시키며, 다른 레그들은 실행됩니다. 어떤
레그도 실행되지 않을 때에만, 레그가 하나뿐일 때처럼 첫 번째 레그의 이유와 함께 호출이 실패합니다.
그 전까지는 레그 하나가 실패하면 매수 전체가 실패했습니다. Robinhood Chain에서는 오라클의 시퀀서
검사가 설정되어 있으면, 멈춰 있거나 막 복구된 시퀀서가 모든 레그를
멈춥니다(Robinhood 레일 참고); 이 검사는 Chainlink가 그 체인의 업타임 피드를
공개할 때까지 꺼져 있습니다.
임계값과 두 한도는 2026-10-05부터 StockFun 오너의 설정의 기본값이며, 모든 볼트가 실시간으로 읽습니다: Ethereum 볼트는 팩토리의 설정을, 미러 볼트의 매수는 리모트 허브의 설정을 읽습니다. 변경은 모든 볼트의 다음 전환에 적용됩니다.
금액과 배정
2026-09-29 보안 감사 이후, 2026-10-01부터:
- 각 단계는 키퍼가 지정한 금액을 지출합니다. 거래 장소가 한도 안에서 흡수할 수 있는 것보다 큰 볼트는 여러 주기에 걸쳐 나누어 전환합니다. 이전에는 모든 단계가 잔액 전체를 지출했고, 거래 장소보다 커진 볼트는 다시는 전환할 수 없었습니다.
- ETH 단계의 한도는 그 금액을 기준으로 계산되며, 실시간 잔액을 기준으로 하지 않습니다. 트랜잭션이 대기하는 동안 거래로 들어오는 ETH가 더 이상 키퍼의 최소 수량을 무효로 만들지 않습니다.
- 현금은 주식별로 배정됩니다. 현금은 들어오는 대로 바스켓 비중에 따라 바스켓의 각 주식에 따로 배정됩니다. 각 주식은 자신의 배정분만 지출하며, 키퍼가 건너뛴 주식은 그 배정분을 나중을 위해 유지합니다. 이전에는 건너뛴 주식의 몫이 바스켓 전체에 다시 나뉘었습니다: 키퍼는 주식을 건너뛰는 방식으로 트레저리의 거의 전부를 한 주식으로 옮길 수 있었습니다.
주식을 매수하는 두 볼트가 모두 이렇게 작동합니다: USDG를 쓰는 Robinhood Chain의 미러 볼트, 그리고 USDC를 쓰는 로컬 레일의 Ethereum 볼트입니다.
2026-10-01 보안 파이프라인 이후로 두 볼트 모두에서, 현금을 배정분 아래로 떨어뜨리는 긴급 이동은 배정분을 모두 0으로 만듭니다: 남은 현금과 이후 들어오는 모든 현금은 바스켓 비중에 따라 새로 나뉩니다. 배정되지 않은 현금이나 다른 자산만 가져가는 긴급 회수는 배정분을 그대로 둡니다. 이전에는 0으로의 초기화가 볼트가 자신의 배정분을 읽는 방식에만 존재했습니다: 예전 배정분은 다음에 들어오는 현금과 함께 되살아났고, 키퍼의 호출 순서가 바스켓의 구성을 결정했습니다.
키퍼의 역할
트리거, 그 이상은 없습니다. 키퍼는 시점을 고르고, 각 단계의 금액을 지정하고, 스왑 경로를 제안하고, 최소 수량을 제공합니다 — 볼트는 이 최소 수량이 자체 오라클 한도보다 느슨하거나, 금액이 그 주식에 배정된 것을 넘으면 이를 거부합니다. 키퍼는 한도보다 더 많이 요구할 수는 있어도, 더 적게 요구할 수는 결코 없습니다. 2026-10-05부터 볼트는 실제로 도착하는 양에 키퍼의 최소 수량을 적용합니다.
키퍼는 각 주식의 배정분을 전부 지출하되, 바스켓의 마지막 주식에서는 n을 주식의 수라고 할 때 n−1 단위를 남겨 둡니다: 키퍼를 참고하십시오.
선택 사항인 Ondo 레일에서는 키퍼가 각 레그에 대해 발행사가 서명한 호가를 볼트에 건넵니다. 그런
호가는 그것을 제시하는 누구에게나 유효하므로, 2026-10-05부터 Ondo 라우터는 팩토리의 볼트, 즉
프로토콜 볼트와 등록된 각 마켓의 볼트만 처리하고 그 밖의 누구든 거부합니다(NotAVault): 다른
누구도 키퍼의 호가를 써 버려 그 전환을 실패하게 만들 수 없습니다. 그리고 프로토콜의 모든 라우터는
자기 자신을 스왑의 수신자로 지정하는 것을 거부하므로, 트랜잭션 사이에 아무것도 보유하지 않습니다.
무엇을 지정하든, 키퍼는 자산을 빼돌리거나, 다른 바스켓을 고르거나, 한 주식의 현금을 다른 주식으로 옮기거나, 한도를 완화할 수 없습니다.
에어드랍
볼트의 주식이 갈 곳은 하나입니다: 매 에어드랍마다, 보유량에 비례해 토큰 홀더에게 갑니다. 배분은 누구도 선택하지 않는 규칙에 따라 잔액에서 도출됩니다 — 크리에이터도 키퍼도 선택하지 않습니다. 메커니즘은 2026-10-04부터 코딩되어 있으며, 배포되지 않았습니다: 에어드랍을 참고하십시오.
로컬 레일에서는 볼트가 직접 자신의 주식을 넘깁니다. 키퍼만 호출할 수 있는
sendToAirdrop(stocks)는 목록에 있는 각 바스켓 주식의 잔액 전체를, 팩토리가 지정하고 볼트가
실시간으로 읽는 에어드랍 컨트랙트로 보냅니다. 볼트는 정확한 금액을 승인하고, 컨트랙트는 이를
가져가 마켓의 현재 주기에 적립하며, 승인은 호출이 끝나기 전에 다시 닫힙니다. 두 번 나열되거나
바스켓 밖에 있는 주식이 있으면 호출이 실패하며, 잔액이 없는 주식은 건너뜁니다. 2026-10-05부터 각
주식은 따로 진행됩니다: 잔액을 읽을 수 없거나 전송이 거부된 주식, 예를 들어 발행사가 동결한 주식은
이벤트(AirdropSendFailed)와 함께 볼트에 남고, 나머지는 진행됩니다; 어떤 주식도 진행되지 않으면
호출은 실패하며 그 이유를 밝힙니다. 브리지 허브에 연결된 볼트는 이 호출을 거부합니다: 그 볼트의
주식은 Robinhood Chain에서 매수되고 보관되며, 그곳에서 미러 볼트가 각 주식의 LayerZero 어댑터를
통해 같은 방식으로 이를 보냅니다.
크리에이터가 트레저리 주식을 매도해 자신의 토큰을 바이백하고 소각할 수 있게 했던 크리에이터
바이백 buybackAndBurn(...)은 2026-09-27에 폐지되었고, 2026-09-28에 코드에서 제거되었습니다.
볼트가 보유할 수 있는 것
ETH, USDC, USDG, 그리고 해당 바스켓의 주식. 여기에 선택 사항인 Ondo 레일에서는 발행사 민트가 환불할 수 있는 USDon이 더해집니다. 볼트는 그 밖에는 아무것도 매수하지 않습니다. 이는 코드에서 비롯되는 것으로, 이를 불변식으로 검사하는 테스트는 없으며, 제3자가 관련 없는 토큰을 볼트 주소로 보내는 것을 막는 장치도 없습니다. 긴급 모드는 그런 토큰도 다른 자산과 마찬가지로 밖으로 옮깁니다.
USDC로 가득 찬 볼트는 고장 난 것이 아니라 이동 중인 것입니다. 세 상태 모두 다음 에어드랍을 기다리는 트레저리로 표시되며, 분배되는 것은 매수가 끝난 주식뿐입니다.
마켓당 프록시 하나
2026-10-02부터 각 마켓의 볼트는 별도의 프록시입니다. 볼트는 마켓과 함께, 그 시점에 팩토리가 지정한 볼트 구현 컨트랙트 앞에 생성되며, 같은 트랜잭션에서 자신의 바스켓, 자신의 마켓, 그리고 그때 팩토리가 지정한 라우터, 오라클, 브리지 허브로 초기화됩니다. StockFun의 오너는 볼트를 하나씩, 마켓별로 업그레이드하며, 업그레이드는 즉시 효력을 가집니다. 팩토리에 새로 지정된 구현 컨트랙트는 그 이후에 생성되는 마켓에만 적용됩니다.
Robinhood Chain의 미러 볼트도 같은 규칙을 따릅니다: Robinhood 레일을 참고하십시오.
긴급 모드
2026-08-29부터 StockFun의 오너는 볼트에서 어떤 자산이든 어떤 주소로든 이동할 수 있으며, 2026-10-05부터 이 이동은 사전 공지 없이 즉시 이루어집니다. 에어드랍과 함께, 현재 구현 컨트랙트에서 자산이 볼트를 떠날 수 있는 유일한 방법이며, 긴급 모드에서 다룹니다.