---
# System prepended metadata

title: Exit(freeze)のテストシナリオ
tags: [テスト設計]

---

# Exit(freeze)のテストシナリオ

###### tags: `テスト設計`


## ZKP
```javascript=
describe("ZKP回路", () => {
    it("user state内の任意の資産の量をmerkle proofで証明をする", () => {});
    it("資産がないのにあると偽るとfailする", () => {});
    it("適当なmerkle Proofをinputに入れてもfailする", () => {});
    it("適当なkeyHashedをinputに入れてもfailする", () => {});
    it("適当なprivateKeyをinputに入れてもonetime Addressが一致しないのでfailする", () => {});
    
    it("userStateMerkleRootの中にuserStateRootが含まれている", () => {});
    it("userStateMerkleRootの中にuserStateRootが含まれていなければfailする", () => {});
    
    
    it("onetime address listにonetime addressが入っていないことを証明する", () => {});
    it("証明できなければfailする", () => {});
    it("適当なProofを入れてもfailする", () => {});
    it("適当なprivateKeyを入れてもfailする", () => {});
    it("適当なnonceを入れてもfailする", () => {});
});
```


## コントラクト
```javascript=
describe("contract", () => {
    it("一定時間L2のブロックがコミットされなかった場合、誰でもfreeze modeにすることができる", () => {});
    
    it("freeze modeかどうかを確認できるview関数があり、freeze中であればtrueが返る", () => {});
    it("freeze modeかどうかを確認できるview関数があり、freeze中でなければfalseが返る", () => {});
    
    it("main commitされたstateはそれ以降exitできるようになる", () => {});
    
    it("Contract address mappingを頼りにL2のアドレスからL1のアドレスに変換される", () => {});
    
    it("指定されたaddressに資産をtransferしている", () => {});
    it("適当なaddressにexitしようとしても、zkpのverifyが通らないのでexitでいない", () => {});
    
    it("一度使用されたProofは再利用できない", () => {});
});
```



## ユーザー（Wallet）
```javascript=
describe("ユーザー（Wallet）", () => {
    
    it("資産を選択して、任意の量をexitするためにzkpできる", () => {});
    it("exitするL1アドレスを選択できる", () => {});

    it("onetime address listをL1から構築する", () => {});
    it("自分のn + 1のonetime addressがonetime address listに入ってないことを証明するzkpを実行する", () => {});
    it("自分のn + 1のonetime addressがonetime address listに入っていた場合はfailする", () => {});
    
    it("最新のuser stateがない場合は、オペレーターもしくは分散ストレージから取得する", () => {});
});
```



## ここに書かないこと
- exit(normal)
- deposit系