긴급 모드
2026-08-29부터 StockFun의 오너는 트레저리의 자산, 또는 프로토콜의 자금을 보유한 어떤 컨트랙트의 자산이든 어떤 주소로든 이동할 수 있습니다. 2026-10-05부터 이 이동은 즉시 이루어집니다: 사전 공지도, 대기 기간도 없으며, 어떤 설정으로도 대기 기간을 추가할 수 없습니다. 이는 프로젝트에서 가장 파급력이 큰 변경이며, 제품이 말할 수 있는 내용을 바꾸었습니다.
허용하는 것
자산을 보유한 컨트랙트에서 호출하는 emergencyTransfer(asset, amount, to)는 어떤 자산이든 — ETH,
USDC, USDG, 토큰화 주식, 마켓 토큰 — 그 수량을 to로 즉시 이동합니다. 이 함수를 갖춘 컨트랙트는
다섯 개입니다: Ethereum의 TreasuryVault, BridgeHub, 그리고 2026-10-04부터 에어드랍 컨트랙트인
AirdropDistributor; Robinhood Chain의 RemoteHub와 미러 볼트. 이를 호출할 수 있는 것은 이
컨트랙트들의 긴급 관리자뿐입니다: Ethereum에서는 팩토리의 오너, Robinhood Chain에서는 마지막 브리지
배치가 전달한 같은 주소입니다. 오너는 이 컨트랙트들 중 어디에서든, 언제든 이를 사용할 수 있습니다.
각 이동에는 순차 id가 부여되며, 자산, 수량, 수령인을 담은 공개 이벤트 EmergencyExecuted가
발생합니다. 사전에 이를 알리는 것은 없습니다.
2026-10-05까지 오너는 이동을 예약했습니다: 공개 이벤트가 이를 알렸고, 오너는 48시간 동안 취소할 수 있었으며, 그 뒤에는 누구나 실행할 수 있었습니다. 이 예약 절차는 사라졌고, 대기 기간은 파라미터가 아닙니다: 긴급 조치는 오너가 사용하는 즉시 작동하며, 결코 기다린 뒤에 작동하지 않습니다. 미러 볼트에 묶인 에어드랍 자금을 위해 계획되었던 예외도 예약 절차와 함께 사라졌습니다. 이 예외는 코딩된 적이 없으며, 즉시 이루어지는 이동이 이미 그 경우를 다룹니다.
이와 함께: 전환과 브리징의 일시 중지(즉시, 자금 이동 없음), 그리고 향후 전송을 위한 브리지 어댑터
교체 changeAdapter(2026-10-05부터 이 역시 즉시)가 있습니다. 에어드랍 컨트랙트에서는 일시 중지가
전송, 주기 개시(openCycle), 따로 보관된 주식의 귀속(assignUnassigned)을 멈추며, 아무것도
이동하지 않고, 청구는 결코 멈추지 않습니다.
2026-10-01부터 일시 중지된 리모트 허브도 각 배치가 담고 있는 키퍼와 긴급 관리자 변경은 적용하므로, 오너 변경은 항상 Robinhood Chain에 전달됩니다. 그동안 허브가 받는 현금은 마켓별로 기록된 채, 일시 중지 해제 후의 스윕까지 그곳에서 기다립니다.
2026-09-29 보안 감사는 어댑터 교체가 처음부터 끝까지 작동할 수는 없다는 것을 발견했습니다: 리모트 허브는 원래 어댑터가 보낸 배치만 받아들이므로, 교체 후에 보낸 모든 배치는 긴급 모드가 회수할 때까지 리모트 허브에서 대기하게 됩니다(M-2). 2026-10-05에 오너는 이를 그대로 유지하기로 결정했습니다: 어댑터는 같은 주소를 유지한 채 제자리에서 업그레이드하는 방식으로 바꾸며, 새 주소를 쓰려면 먼저 리모트 허브를 업그레이드해 그 주소를 받아들이게 해야 합니다.
볼트에서는 2026-10-01 보안 파이프라인 이후로, 현금을 주식들의 배정분 아래로 떨어뜨리는 긴급 이동이 배정분을 모두 0으로 만듭니다: 남은 현금과 이후 들어오는 모든 현금은 바스켓 비중에 따라 새로 나뉩니다. 배정되지 않은 현금이나 다른 자산만 가져가는 긴급 회수는 배정분을 그대로 둡니다. 밖으로 나갔다가 볼트로 다시 보내진 현금은 들어오는 다른 현금과 똑같이 나뉘며, 원래 배정되어 있던 주식으로 돌아가지 않습니다.
2026-10-01에 진행된 감사의 두 번째 라운드는, 리모트 허브에서 이미 어떤 마켓의 몫으로 기록된 현금을 가져가는 긴급 회수가 그 기록을 그대로 남겨 두어, 그 기록이 다른 마켓들의 현금으로 지급된다는 것을 발견했습니다(R2H-1). 2026-10-05부터는 이동 뒤에 아래의 정산이 이어지며, 이 경우는 그 정산 도구들과 하나의 절차로 다루어집니다: 정식 브리지 레일에서는 StockFun의 오너가 이동 전에 리모트 허브를 일시 중지합니다. 그날의 네 번째 감사 루프 이후로는 이동을 한 마켓에 차감할 수도 있으며, 이때 그 마켓의 장부는 같은 호출에서 정산됩니다.
이동 이후: 장부 정산
2026-10-05 감사 루프들 이후, 그날부터 적용됩니다. 이동 자체는 바뀌지 않았습니다: 즉시, 아무 조건 없이 이루어집니다. 하지만 두 컨트랙트는 여러 마켓에 지급해야 할 것을 뒷받침하는 자산을 보유합니다: 에어드랍 컨트랙트와 리모트 허브입니다. 둘 중 어느 쪽에서든 이동이 일어난 뒤에는 장부가 정산될 뿐, 결코 다른 마켓의 몫에서 지급되지 않습니다. 자산이 돌아오거나, StockFun의 오너가 손실을 입은 마켓에서 그 손실을 상각합니다.
두 컨트랙트는 자신의 장부를 뒷받침하는 것을 셀 뿐, 결코 잔액을 세지 않습니다. 잔액에는 도착했지만 아직 적립되지 않은 토큰도 들어 있습니다: Ethereum에서의 마지막 단계가 아직 실행되지 않은 주식의 전달, 또는 USDG 레일의 경우 Robinhood Chain에서의 마지막 단계가 아직 실행되지 않은 배치의 현금입니다. 그 토큰들은 아직 아무것도 뒷받침하지 않으며, 다른 마켓의 것일 수 있습니다. 2026-10-05의 두 번째 루프 전까지 두 컨트랙트는 잔액을 읽었으므로, 그런 토큰이 비워진 주기의 청구를 다시 열어 다른 마켓의 주식으로 그 청구에 지급할 수 있었습니다.
- 긴급 이동은 장부를 뒷받침하는 것에서 먼저 가져갑니다. 토큰들은 서로 구별할 수 없으며, 적립된
토큰이 먼저 나간 것으로 세면 한 마켓이 다른 마켓의 대가를 치르는 일은 결코 생기지 않습니다. 그것을
넘어 가져간 것은 아직 적립되지 않은 토큰에서 나온 것입니다: 컨트랙트는 이를 기록하며(
taken,cashTaken), 그 자산의 다음 전달들은 무엇이든 뒷받침하기 전에 먼저 이를 메웁니다. - 자산은
restore를 통해 돌아옵니다. 누구나 이를 호출할 수 있으며, 이 함수는 호출자에게서 토큰을 가져옵니다. 컨트랙트로 보내는 단순한 전송은 아무것도 뒷받침하지 않습니다. 2026-10-05의 세 번째 감사 루프 이후로,restore는 이동이 장부를 뒷받침하는 것을 넘어 가져간 것(taken,cashTaken)을 먼저 메우고, 나머지로 장부를 뒷받침합니다: 아직 대기 중인 전달의 토큰이 비워진 마켓에 지급되는 일은 결코 없습니다. 잘못 들어온 토큰. 실수로 보내져 한 번도 적립되지 않은 채 에어드랍 컨트랙트나 USDG 레일의 리모트 허브에 도착한 토큰도, 긴급 이동이 이를 꺼내 가면 장부를 뒷받침하는 것에서 차감됩니다. 긴급 이동은 이런 토큰을 복원하기 위해서만 꺼냅니다; 그렇지 않으면 그 금액을 떠안게 되는 주기나 마켓에서 상각하거나, 업그레이드로 정리해야 합니다.
에어드랍 컨트랙트는 자신이 지급해야 할 양과 그것을 뒷받침하는 양을 주식별로 관리하며, 그것을 뒷받침하는 양이 지급해야 할 양을 충당하는 동안에만 그 주식을 지급합니다. 어떤 주식의 일부를 가져간 이동 이후에는, 그 주식을 보유한 모든 마켓에서 그 주식의 청구가, 그 주식이
restore를 통해 돌아올 때까지, 또는 오너가 그 손실을 그 주식을 잃은 주기에서(writeDownCycle), 또는 어떤 마켓이 따로 보관하고 있는 주식에서(writeDownUnassigned) 상각할 때까지 대기합니다. 아무도 그 주기에서 그 주식을 청구하지 않은 동안에는 오너가 그중 어느 부분이든 상각할 수 있으며, 그 주기의 모든 홀더가 같은 비율을 잃습니다; 일부 홀더가 지급받은 뒤에는 오너는 아직 지급받지 않은 홀더들이 잃게 되는 남은 양 전체를 상각하거나, 그 주식을 되돌려 놓을 수만 있습니다. 그 뒤에 그 주기에 도착하는 것은 무엇이든, 상각된 양이 처음부터 없었던 것처럼 그 주기의 모든 홀더에게 비례 배분으로 나뉩니다. 다른 어떤 주기도 그 대가를 치르지 않습니다. 네 번째 감사 루프 이후로 청구는 대기하는 주식만 연기하고(ClaimDeferred) 나머지는 같은 호출에서 지급합니다; 그 전까지는 청구 전체가 실패했습니다. 에어드랍 컨트랙트에는 한 주기에 차감되는 이동이 없습니다: 컨트랙트 크기 제한 때문에 그럴 여유가 없었습니다. 장부가 결코 부족해지지 않게 하는 절차는 먼저 그 주기나 따로 보관된 주식을 상각한 다음 주식을 옮기는 것입니다; 먼저 이루어진 이동은 위에서 말한 전반적인 대기를 그대로 따릅니다.- USDG 레일의 리모트 허브는 지급해야 할 것을 뒷받침하는 현금을 세며, 그것이 모자라는 동안에는
내주기를 거부합니다(
sweep). 그보다 많이 가져간 이동 이후에는, 다음 배치들이 그만큼을 메울 때까지 전달되는 대신 기록됩니다. 오너는 현금을 되돌려 놓거나(restore), 잃어버린 금액, 또는 이동이 마켓의 미러 볼트에 수동으로 전달한 금액을 상각합니다(writeOffPending). 네 번째 감사 루프 이후로 오너는 이동을 한 마켓에 차감할 수도 있습니다:emergencyTransferFromPending(marketId, amount, to)는 허브가 그 마켓에 지급해야 할 것을 옮기고 같은 호출에서 이를 상각하므로, 장부는 결코 부족해지지 않으며 다른 어떤 마켓도 기다리지 않습니다. - 정식 브리지 레일의 리모트 허브는 대기열에 있는 기록들을 지급할 의무가 있으며, 그런 집계를 하지
않습니다: 보호는 절차로 이루어집니다. 오너는 이동 전에 허브를 일시 중지하고, 현금을 옮기고, 그
현금이 속해 있던 기록을 제거한 뒤(
writeOffRecord), 일시 중지를 해제하며, 그래서 대기열이 다른 마켓의 현금으로 그 기록을 두 번 지급하는 일은 결코 없습니다. 네 번째 감사 루프 이후로는 기록 하나에 대해 호출 하나로 이를 처리합니다:emergencyTransferRecord(index, to)는 기록의 금액 전체를 옮기고 그 기록을 제거합니다. 다섯 번째 루프 이후로 이 호출은 입금이 도착한 기록을 위한 것입니다: 대기열의 현금은 한데 모여 있으므로, 거부된 몫을 위해 보관된 것이 아닌 현금을 넘는 금액은 거부합니다(RecordNotCovered); 입금을 잃어버린 기록은writeOffRecord로 제거합니다. 미러 볼트가 거부해 그 마켓을 위해 별도로 보관된 몫(undeliverable)은emergencyTransferFromPending으로 옮기고 상각합니다.
각 상각은 공개 이벤트(WrittenDown, PendingWrittenOff)를 발생시키며, 각 반환(Restored)과
연기된 각 청구(ClaimDeferred)도 마찬가지입니다.
레스큐: 모듈이 실수로 보유한 것
2026-10-05부터, 자금을 보유할 수 있는 모든 것에는 조치 수단이 있어야 한다는 창업자의 규칙에 따라(아키텍처 참고), 긴급 모드가 없는 컨트랙트에는 실수로 보내졌거나 실패한 작업이 남긴 것을 위한 자체 레스큐가 있습니다. 이를 호출하는 것은 StockFun의 오너뿐입니다: Ethereum에서는 팩토리의 오너, Robinhood Chain에서는 리모트 허브의 관리자이며, 모듈을 업그레이드하는 것과 같은 주소입니다. 각 레스큐는 공개 이벤트를 발생시킵니다.
- 트랜잭션 사이에 누구의 것도 보관하지 않는 모듈 — 팩토리, Lens, 오라클, 보유량 기록기, 주식
라우터, 공식 스왑 라우터, 브리지 어댑터 — 에는 ETH(제로 주소)나 어떤 토큰이든 꺼낼 수 있는
rescue(asset, amount, to)가 있습니다 - 훅은 잘못 들어온 자금만 레스큐로 꺼냅니다: 많아야
PoolManager가 아닌 누군가가 훅에 보낸 ETH(strayEth)만큼, 그리고 훅은 토큰을 결코 보유하지 않으므로 어떤 토큰이든. 크리에이터, 팀, 바이백의 잔액과 볼트들에 대한 채무는 결코 그 방법으로 나가지 않습니다. 호출 없이 강제로 들어온 ETH는 계산되지 않으며, 업그레이드를 기다립니다 - 업그레이드할 수 없는 유동성 락은 어떤 토큰이든, 그리고 볼트와 크리에이터를 위해 보관하는
몫(
totalOwed)을 넘는 ETH를 레스큐로 꺼내며, 그 몫은 결코 그 방법으로 나가지 않습니다; 다섯 번째 감사 루프 이후로는PoolManager에서 락에 적립된 v4 클레임(rescueClaims)과 단순한 전송으로 락에 보내진 NFT(rescueNft)도 꺼냅니다. 락에는 범용 호출이 없습니다: 그런 호출이 있으면PoolManager를 통해 30일을 거치지 않고 종료 모드의 회수에 이를 수 있습니다. 락의 포지션에는 여전히 종료 모드를 통해서만 닿을 수 있습니다 BuybackBurner는 토큰은 언제든, 자신의 ETH는 어떤 소각도 그것을 쓸 수 없게 된 뒤에만 레스큐로 꺼냅니다: 프로토콜 마켓이 지정되기 전, 또는 종료 모드가$STOCKFUN풀을 회수한 뒤. 그 풀이 잠겨 있는 동안 그 ETH는 소각을 통해서만 나갑니다- 업그레이드할 수 없는 토큰은 자신의 주소로 보내진 것을 레스큐로 꺼냅니다: 다른 전송과
마찬가지로 보유량 기록기에 보고되는 자기 자신의 토큰, 그 밖의 어떤 토큰, 강제로 들어온 ETH,
그리고 다섯 번째 감사 루프 이후로는 v4 클레임과 NFT(
rescue,rescueClaims,rescueNft). 어떤 홀더의 잔액도 그 방법으로 움직일 수 없습니다 - 프록시 뒤의 구현 컨트랙트는 결코 직접 사용되지 않습니다. 관리자를 프록시의 스토리지에 두는 팩토리와 리모트 허브의 구현 컨트랙트에서는, 그 주소로 보내진 것에 대한 조치 수단이 그것을 배포한 주소입니다; 그 밖의 모든 구현 컨트랙트는 자신의 권한자, 즉 프로토콜 오너를 통해 관리자를 읽습니다
볼트, 두 허브, 에어드랍 컨트랙트는 자체 장부를 관리하므로, 대신 긴급 모드를 유지합니다. Ethereum의 두 배포자 컨트랙트와 미러 볼트 배포자는 상태를 보유하지 않고, ETH를 받지 않으며, 오너가 없습니다: 조치 수단이 필요하지 않습니다.
허용하지 않는 것
긴급 모드는 피드 레지스트리를 건드리지 않습니다. 자산을 이동할 뿐, 실행 한도를 바꾸지 않습니다. 실행 한도는 오너의 별도 설정입니다. 긴급 모드는 볼트가 아무 가격에나 아무것이나 매수하게 만들 수는 없지만, 볼트에 있는 것을 즉시 가져갈 수는 있습니다.
잠긴 유동성이나 홀더의 토큰에 손댈 수도 없습니다. 에어드랍도 마찬가지입니다: 긴급 모드는 에어드랍 컨트랙트의 주식을 이동할 수는 있지만, 한 주기가 그 홀더들 사이에 어떻게 나뉘는지는 바꿀 수 없습니다. 몫은 그대로 남습니다; 2026-10-05부터 청구는 컨트랙트의 장부를 뒷받침하는 것이 그 주식에서 지급해야 할 것을 모두 충당하는 동안에만 지급되며, 돌아오지 않을 손실은 그 손실을 입은 주기에서 차감될 뿐, 결코 다른 주기에서 차감되지 않습니다(위 참고).
하지만 긴급 모드가 오너가 볼트에 손댈 수 있는 유일한 경로는 아닙니다. 2026-10-02부터 StockFun의 오너는 볼트나 볼트가 읽는 오라클을 업그레이드할 수도 있으며, 이 역시 즉시 효력이 발생합니다. 잠긴 유동성에는 30일 전에 공지되는 별도의 출구, 종료 모드가 있습니다: 프로토콜에서 유일하게 고정된 대기 기간입니다. 신뢰 모델을 참고하십시오.
존재 이유
크로스체인 장애 모드 검토는 단순한 질문을 던졌습니다: 경로가 실패하거나, 브리지 메시지가 유실되거나, 컨트랙트에 버그가 있으면 어떻게 되는가?
회수 경로가 없다면 답은 "자금은 영구히 사라진다"입니다. 프로토콜은 아무것도 고칠 수 없는 시스템의 우아함 대신, 오너가 쥐고 온체인에 기록되는 통제된 회수 경로를 선택했습니다. 2026-10-05부터 이 경로는 사용하는 즉시 작동합니다.
2026-10-01부터는 Robinhood Chain이 바스켓을 거부한 마켓의 현금이 그 마켓의 미러 볼트를 떠나는 방법도 이것이며, 그 미러 볼트는 초기화되지 않은 상태로 남습니다: Robinhood 레일을 참고하십시오.
대가
오너는 트레저리의 자산을 사전 공지 없이 즉시 어떤 주소로든 이동할 수 있습니다. 이는 프로젝트의 신뢰 모델에 명시되어 있습니다.
무엇보다, 검증된 문구가 이전의 모든 약속을 대체합니다.
자산은 마켓의 볼트가 보유하며 그 규칙의 적용을 받습니다. StockFun 팀은 긴급 상황에서 48시간의 공개 대기 기간 후 트레저리의 자산을 이동할 수 있습니다.
2026-10-05부터 이 문장의 대기 기간은 더 이상 존재하지 않습니다: 이동은 즉시 이루어집니다. 이 문장은 수정되어야 하며, 새 문구는 검증을 거쳐야 합니다. 2026-10-02부터는 즉시 효력이 발생하는 볼트의 업그레이드도 이 문장이 다루지 않습니다.
제품은 더 이상 non-custodial, trustless, 불변 트레저리, 누구도 트레저리를 건드릴 수 없다라고 말할 수 없습니다. 이 표현들은 브랜딩 규칙에 따라 금지되어 있습니다. 자동 카피 감사는 이를 검사하지 않으며, 검토가 이를 확인합니다.
긴급 모드는 손실에 대한 보호 장치나 보장으로 결코 설명되지 않습니다. 이는 즉시 효력이 발생하는, 팀이 가진 권한입니다. 그 이상은 아닙니다.
사용자에게 보이는 것
2026-10-05까지는 영향을 받는 모든 화면에 예약된 회수를 실행 날짜와 함께 알리는 배너가 표시될
예정이었습니다. 이제 이동은 즉시 이루어지므로 미리 알릴 것이 없습니다: 이동은 사후에, 자산이 떠난
컨트랙트의 EmergencyExecuted 이벤트에서 확인할 수 있습니다.