# 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系