Tomb系崩壊で死にかけた私がDEX botで首の皮一枚繋げていた話

# 自己紹介
閲覧ありがとうございます
[仮想通貨botter Advent Calendar 2022](https://qiita.com/advent-calendar/2022/botter)の2日目に参加させていただきました、[塩ハム(d)](https://twitter.com/shio_hamu_d)と申します
仮想通貨関連アカウントでは[右腕の毛](https://twitter.com/RightArmHair_C)と名乗っています(ややこしい)

今回紹介させていただくのは経験談であり、エッジが消えているものなので後追いはできません
しかし我々の戦場は変化の激しい仮想通貨界隈、いつかこの経験を活かすことができるかもしれません
では以下紹介していきます

今年の3月頃FantomブロックチェーンのTomb関連銘柄の崩壊に巻き込まれた、今年の1月後半に仮想通貨に手を出した私
そんな冒頭から死にかけの私が所属しているDiscordで、ある実験的プロジェクトを見つけたとの書き込みがありました
コードが読めることが望ましい、興味のある方は紹介します
とのことだったのでいずれbotが組みたいと思っていた私は勇気を絞り、搾りたての勇気でプロジェクトを紹介してもらいました

# Defi Olympiads
照会していただいたのは、Fantomで立ち上げられた、[Defi Olympiads](https://www.defiolympiads.com)(終了済)というプロジェクトです
よくわかりませんが、監査に時間とお金をかけるぐらいならユーザー自らにコードを見てもらい判断させろ、という趣旨らしいです
Discordでは、このプロジェクトの書き方的にアンドレ(yearn.financeを開発した天才)じゃね？　と噂されていました
(真相は私にはわかりませんでした)

テストプロトコルの後に本番プロトコルが実施される予定だったそうです
テストプロトコルのルールはいたって単純でした

1.プレイヤーはDOLAというドルペグトークンをCurve.financeで購入し、それを3か月ロックすることでDOLAと同量のTicketトークンを受け取ります
2.Ticketトークンを消費することで、ある数式に基づきMedalトークンが発行されます
3.参加者は可能な限りMedalトークンを集めることで、この次に始まる(予定だった)本番プロトコルのエアドロップを得ることができます
4.ハッキングや悪意のコントラクトなどによるありとあらゆる手段(暴力を除く)が許されます、すべては自己責任です
5.最初の7日間に限り、デポジットを追加することでゲームに参加可能です

流れをグラフにすると以下のようになります

```mermaid
graph LR;
    subgraph Curve
        D[DOLA]
    end

    subgraph Defi Olympiads
        T[Ticket]
        M[Medal]
    end
    D --Lock--> T --Mint--> M
```

Medalの発行に使う数式は以下のものが使われていました

```math
y = (x\times r \times t - x\times s) / (y + x)
```

> y = 受け取るMedalトークンの量
> x = 消費Ticket
> r = 1秒当たりのMedalトークン排出率
> t = コントラクト開始からの秒数
> s = 総排出Medalトークン

ははあ、これ立ち回りめっちゃむずいやつだ()
数式からすると、時間が経つごとにMedal発行数が上がっていくが、Medalが発行されると総排出量が増えるため発行のたびにMedal発行数下がるやつだ
ダッチオークションというらしいですね、これ
あきらめて1DOLAだけ買って何とか頑張ろう……そう思っていました

# 流動性の追加

3月23日 23時6分52秒(unix時間:1648044412) 
コントラクトがアップロードされ、Medalの発行が始まりました
始まってほどなくして、SpookySwapにTicket/Medalの流動性が追加されました
……もう一度書きます、 __SpookySwap__ に __Ticket/Medal__ の流動性が追加されました

```mermaid
flowchart LR;
    subgraph SpookySwap
        TT[Ticket]
        MM[Medal]
        TT <--> MM
    end

    subgraph Curve
        D[DOLA]
    end

    subgraph Defi Olympiads
        T[Ticket]
        M[Medal]
    end

    D --Lock--> T --Mint--> M
```
これが何を意味するかというと

1.Ticketを消費しMedalを発行
2.発行したMedalをTicketにswap
3.1に戻る

の手順を踏み、レートによりますがTicketを増やすことができるようになりました
ガス代と引き換えに、3月24日　20時15分時点で以下のようになりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668804/e798ca66-fa71-195a-e09d-65732c500ca0.png)
![character_choujin_tangatamanu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668804/bb2ea5a0-d8f4-44d8-bc68-ec0a106d247a.png)

なんかbotでもできそうだなーと思いつつ直コンでポチポチしてました

その後もポチポチしつつ過ごしていた3月28日頃
SpookySwapにTicket/USDCの流動性が追加されました
……もう一度書きます、 __SpookySwap__ に __Ticket/USDC__ の流動性が追加されました

```mermaid
flowchart LR;
    subgraph SpookySwap
        TT[Ticket]
        MM[Medal]
        U[USDC]
        TT <--> MM
        TT <--> U
    end

    subgraph Curve
        D[DOLA]
    end

    subgraph Defi Olympiads
        T[Ticket]
        M[Medal]
    end

    D --Lock--> T --Mint--> M
```

![nigaoe_nitobe_inazou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668804/40a16fec-d222-f41d-d111-f84d401cd2bd.png)

botを作ることに決めました

# Dutch Auction mint bot

当時の私にあったのはある程度のC言語のスキルと、ほんの少しのJavaの経験、そして何となく独学中のPythonの知識でした
調べたところ、Pythonで[web3.py](https://web3py.readthedocs.io)を使うのが一番難易度が低そうです
私にも作れそうなプログラムだと、以下のような簡単なフローチャートになりました

```mermaid
flowchart TD;
    subgraph main関数
        S[Start]
        I[Initialize]
        C[mint数の予測がしきい値を超えたか]
        M[mint]
        S --> I --> C --yes--> M --> C --No--> C
    end
    subgraph Initialize
        CN[Fantomに接続]
        CH[Ftm,Ticketの残りがしきい値以上か]
        ER[残高不足]
        E[Initialize End]
        
        CN --> CH --yes--> E
        CH --No--> ER
        
    end
```

3月30日に一応のbot完成、しかしトランザクション失敗やガス代の調整失敗、Nonceの取得ミスなどでよくエラー落ちするものでした
改修を重ねつつ動かしてはそれぞれを増やしていました
Discordに残っていたログを見ると以下のような動作結果が残っていました

4月1日　13時17分
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668804/0fe693d3-c840-4ad6-99b0-ee0503c1fcac.png)
4月1日　13時19分
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668804/91c5e90d-53fa-1637-5680-dc9234d85b28.png)

わかりづらいですが、Ticketを6枚消費しMedalを57枚発行しています

そんなこんなでMedal発行とTicket交換、ガス代調達を繰り返すこと2か月……
続報のないまま以下の数値まで攻略していました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668804/5bc07566-1faf-25d1-7150-aaddd6b7c2a5.png)

おそらくこのプロジェクトで一番効率よく動けたのは私ではないかと思っています

そして6月20日　3時10分
残念なことに[Twitter](https://twitter.com/DefiOlympiads/status/1538584998361673730)にてプロジェクト失敗との発表がありました
6月22日にはTicket/USDCの流動性が抜かれ、完全にプロジェクトは終了しました

今まで仮想通貨界隈で生き残れたのはこのプロジェクトで稼ぎ、いろいろなところで経験を積めたからなのだろうと思います
私の生命線といえるプロジェクトでした

この経験を通して私が学んだのは稼ぐためのエッジは人それぞれあり、それを見つけられるかどうかにかかっているのだろうということです
退場さえしなければ誰にでもチャンスはある、そんな気がするのです

最後にgithubに上げた、稼げていたbotのリンクを貼って締めさせていただきます
読んでいただきありがとうございました

https://github.com/shiohamu/Defi_Olympiads_mint_bot