POLTech：ソーシャル化する Proof of Liquidity [Berachain Blog]


:::note info
本記事は下記の翻訳となります。
[『POLTech: Proof of Liquidity goes Social』](https://blog.berachain.com/blog/poltech-proof-of-liquidity-goes-social)
:::

![](https://blog.berachain.com/_next/image?url=https%3A%2F%2Fberachain.ghost.io%2Fcontent%2Fimages%2F2024%2F10%2FPOLTech--2-.png&w=1920&q=75)

# friend.tech の原理を PoL に取り入れた POLTech の紹介

[friend.tech](https://www.friend.tech/?ref=berachain.ghost.io) は、個人的な感想はさておき、コンテンツとの関わり方や、インフルエンサーの注目や洞察に対して我々が付与する金銭的価値を再定義しました。

今回ご紹介する [POLTech](https://poltech.vercel.app/?ref=berachain.ghost.io) は、friend.tech のソーシャルトレーディング要素を Berachain の [Proof of Liquidity](https://blog.berachain.com/blog/the-pol-post?ref=berachain.ghost.io)（PoL）パラダイムに統合したものです。POLTech は、典型的な「ERC20 receipt token をステーキングして `BGT` を獲得する」という枠を超えた、PoL の適応性を示しています。興味がありますか？詳しく見ていきましょう。

## 概要

この記事では、以下の内容を解説します：

1. POLTech アプリの仕組みと機能
2. POLTech のシェアトレーディングと PoL ステーキングを本質的に結びつけるスマートコントラクトの詳細

## POLTech アプリの概要

アプリはこちらでご確認ください：[https://poltech.vercel.app/](https://poltech.vercel.app/?ref=berachain.ghost.io)

`BERA` トークンを使用して、特定のアドレスに関連付けられたシェアの売買ができます。

![](https://berachain.ghost.io/content/images/2024/09/buyshares3.gif)

### BGT のための自動ステーキング

すべてのシェア購入は自動的に Rewards Vault にステーキングされ、`BGT` 報酬の受給資格が得られます。

**リーダーボード**ページで、シェア購入から発生した BGT を請求できます。

![](https://berachain.ghost.io/content/images/2024/09/image-3-1.png)

### チャット

あるアドレスのシェアを所有することで、そのアドレスの所有者や他のシェア保有者との排他的なチャットに参加する権利が得られます。

![](https://berachain.ghost.io/content/images/2024/09/chat2.gif)

面白そうですよね？[https://poltech.vercel.app/](https://poltech.vercel.app/?ref=berachain.ghost.io) で試してみてください。

## POLTech スマートコントラクト

注意深い読者は「_待って、デモユーザーは Reward Vault にステーキングしていないのに、どうやって `BGT` を獲得しているの？_」と疑問に思うかもしれません。

とても合理的な質問です。多くの場合、ユーザーは [Vaults ダッシュボード](https://bartio.station.berachain.com/gauge?ref=berachain.ghost.io) で資産をステーキングする必要があると考えているからです。しかし、*スマートコントラクトがユーザーに代わってステーキングできる*機能についてはあまり知られていません。

> **コントラクトは Reward Vaults の `delegateStake` 関数を使用して、ユーザーの PoL ステーキングポジションを管理できます**

以下の図は、異なる要素がどのように相互作用するかを示しています：

![](https://berachain.ghost.io/content/images/2024/10/image.png)

POLTech コントラクトはこちらで確認できます：[https://bartio.beratrail.io/address/0x2B1B76961C0e38DD79FEf76611f71465d4b0B817/contract/80084/code](https://bartio.beratrail.io/address/0x2B1B76961C0e38DD79FEf76611f71465d4b0B817/contract/80084/code?ref=berachain.ghost.io)

### `delegateStake` による自動ステーキング

`POLTech` コンストラクタは、`POLTech` コントラクトが制御する新しいダミーステーキングトークンを作成します。このトークンの唯一の目的は、ユーザーの `BGT` ステーキングポジションを表現することです。

以下で、POLTech コントラクトが新しい `PoLStakingToken` を作成し、その後 [Factory](https://bartio.beratrail.io/address/0x2B6e40f65D82A0cB98795bC7587a71bfa49fBB2B/contract/80084/code?ref=berachain.ghost.io) から Reward Vault を作成する様子を見ることができます：

```solidity
  constructor() {
      address vaultFactory = 0x2B6e40f65D82A0cB98795bC7587a71bfa49fBB2B;

      stakingToken = new PoLStakingToken(address(this));

      polVault = IBerachainRewardsVault(
          IBerachainRewardsVaultFactory(vaultFactory).createRewardsVault(
              address(stakingToken)
          )
      );
  }
```

ユーザーがシェアを購入すると、コントラクトは自動的に同等の価値を Vault にステーキングします（`buyShares` 関数内で）：

```solidity
  // シェア購入額に応じてミントとステーキングを行う
  stakingToken.mint(address(this), buyPrice);
  stakingToken.approve(address(polVault), buyPrice);
  polVault.delegateStake(msg.sender, buyPrice);
```

購入者が得る PoL 権利（`delegateStake` を通じて）は、`buyPrice`（シェアに支払った `BERA` の量）によって決定されます。

POLTech のシェア価格の仕組みについて簡単に見ていきましょう...

### 動的価格メカニズム

`POLTech` コントラクトは、需要に応じて価格が変動するボンディングカーブを実装しています：

```solidity
function getBuyPrice(
    address subject,
    uint256 amount
) public view returns (uint256 totalCost, uint256 endPrice) {
    uint256 price = getSharePrice(subject);

    totalCost = 0;
    for (uint256 i = 0; i < amount; i++) {
        totalCost += price;
        price = price + PRICE_CHANGE_FACTOR; // 購入ごとに価格が上昇
    }

    endPrice = price;
    return (totalCost, endPrice);
}
```

### シェアを売る時は、この論理を単純に逆にするだけ？

簡単に振り返ってみましょう：

- アドレスのシェアの価格は、購入する人が増えるほど上昇します
- シェアの購入に*支払う*金額が多いほど、Vault により多くの金額がステーキングされます

売却時は逆に、シェアの価格は下がります。そのため、価格は上下すると予想され、注目のための動的な市場を作り出しています。

> では、購入時より**高い価格または低い価格**でシェアを売却する場合、あなたの Vault/PoL ステークはどうなるのでしょうか？

これは問題です。なぜなら、売却時に得られる金額を単純にアンステークすることはできないからです。結局のところ、それらのシェアにより少ない金額を支払っているかもしれません！

### FIFO ロット追跡

シェア価格の変動に伴う PoL ステークの追跡問題を解決するため、`POLTech` は FIFO ロット追跡システムを使用して、各ユーザーが最初にシェアに支払った金額の記録を維持します：

```solidity
struct Lot {
    uint256 shares;
    uint256 stakedAmount;
}

mapping(address => mapping(address => Lot[])) public shareLots;

// シェア購入時（buyShares）：
shareLots[msg.sender][subject].push(
    Lot({shares: amount, stakedAmount: buyPrice})
);

// シェア売却時（sellShares）：
while (sharesToSell > 0) {
    Lot storage lot = shareLots[msg.sender][subject][0];
    // 最も古いロットから処理
    if (lot.shares <= sharesToSell) {
        // ロット全体を売却
        totalStakeToWithdraw += lot.stakedAmount;
        sharesToSell -= lot.shares;
        removeLot(msg.sender, subject);
    } else {
        // ロットの一部を売却
        uint256 partialStake = (lot.stakedAmount * sharesToSell) / lot.shares;
        totalStakeToWithdraw += partialStake;
        lot.shares -= sharesToSell;
        lot.stakedAmount -= partialStake;
        sharesToSell = 0;
    }
}

// totalStakeToWithdraw の計算後（sellShares 内）
polVault.delegateWithdraw(msg.sender, totalStakeToWithdraw);
stakingToken.burn(address(this), totalStakeToWithdraw);
```

FIFO ロットは以下のように機能します：

1. シェアが購入されると、新しい `Lot` が作成され、そのサブジェクト/アドレスに対するユーザーのロット配列に追加されます。各 `Lot` は以下を保存します：
   1. **購入したシェア**の数
   2. **ステーキングされた金額**（購入価格に対応）
2. シェアを売却する際、コントラクトは最も古いロットから処理します（FIFO）
3. `Lot` が完全に消費された場合は削除されます。ロットの一部のみが売却された場合、そのロットの残りのシェアとステーキング金額が更新されます
4. このプロセスは、売却されるすべてのシェアが考慮されるまで続き、最終的に `totalStakeToWithdraw` で `delegateWithdraw` を呼び出します

会計学の教授も満足するでしょう。

## 結論

ここまで読み進めていただいた方は、POLTech が SocialFi のコンテキストにおいて Proof of Liquidity を巧みに統合する方法について、貴重な洞察を得られたことでしょう。重要なポイントを振り返ってみましょう：

- **自動ステーキング**：[`delegateStake`](https://gist.github.com/larrythecucumber321/0e6399e980a70cf6a012af4719554e46?ref=berachain.ghost.io#file-berachainrewardsvault-sol-L246) はユーザーの PoL ステークを自動的に管理するための強力な機能です。逆に、ユーザーが退出/売却する際は [`delegateWithdraw`](https://gist.github.com/larrythecucumber321/0e6399e980a70cf6a012af4719554e46?ref=berachain.ghost.io#file-berachainrewardsvault-sol-L268) を使用します
- **FIFO ロット追跡**：POLTech は、シェア価格が変動しても、ユーザーのステークを正確に追跡します

PoL を他の興味深いアプリケーションに適用する例は、まもなく公開予定です！

---

### 🐻 完全なコードリポジトリ

最終的なコードを確認し、他のガイドを見たい場合は、[**_POLTech Code_**](https://github.com/larrythecucumber321/poltech?ref=berachain.ghost.io) をチェックしてください。

### 🛠️ さらに開発したい方へ

詳細をより深く理解したい場合は、[**_Berachain Docs_**](https://docs.berachain.com/?ref=berachain.ghost.io) をご覧ください。

### 開発サポートをお探しの方へ

[**_Berachain Discord_**](https://discord.com/invite/berachain?ref=berachain.ghost.io) サーバーに参加し、開発者チャンネルで質問してください。

❤️ この記事への「いいね」をお忘れなく 👏🏼

---

:::note info
【Sunrise とは】
Sunrise は Proof of Liquidity(PoL)と Fee Abstraction（手数料抽象化）を備えたデータ可用性レイヤーです。 私たちは DA の体験を再構築し、多様なエコシステムからのモジュラー型流動性を活用してロールアップを立ち上げています。

- [Sunrise - Specialized DA Layer for Proof of Liquidity](https://sunriselayer.io/)
- [Sunrise / Gluon Docs](https://docs.sunriselayer.io/)

【Social Links】

- [X(旧 Twitter)[英語])](https://twitter.com/SunriseLayer)
- [X(旧 Twitter)[日本語])](https://twitter.com/SunriseLayer)
- [Discord Community](https://discord.com/invite/sunrise)
- [Medium](https://sunriselayer.medium.com/)
- [Github](https://github.com/sunriselayer)
- [Linkedin](https://www.linkedin.com/company/sunriselayer)

【お問合せ】
Sunrise へのお問い合わせはこちらから 👉 [Google Form](https://forms.gle/h8RVahxRtXUvYwnv6)

![1080x360.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839047/8971d83b-3331-4757-dc72-320d28618735.jpeg)

:::