2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

本記事は下記の翻訳となります。
『POLTech: Proof of Liquidity goes Social』

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

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

今回ご紹介する POLTech は、friend.tech のソーシャルトレーディング要素を Berachain の Proof of Liquidity(PoL)パラダイムに統合したものです。POLTech は、典型的な「ERC20 receipt token をステーキングして BGT を獲得する」という枠を超えた、PoL の適応性を示しています。興味がありますか?詳しく見ていきましょう。

概要

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

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

POLTech アプリの概要

アプリはこちらでご確認ください:https://poltech.vercel.app/

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

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

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

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

チャット

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

面白そうですよね?https://poltech.vercel.app/ で試してみてください。

POLTech スマートコントラクト

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

とても合理的な質問です。多くの場合、ユーザーは Vaults ダッシュボード で資産をステーキングする必要があると考えているからです。しかし、スマートコントラクトがユーザーに代わってステーキングできる機能についてはあまり知られていません。

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

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

POLTech コントラクトはこちらで確認できます:https://bartio.beratrail.io/address/0x2B1B76961C0e38DD79FEf76611f71465d4b0B817/contract/80084/code

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

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

以下で、POLTech コントラクトが新しい PoLStakingToken を作成し、その後 Factory から Reward Vault を作成する様子を見ることができます:

  constructor() {
      address vaultFactory = 0x2B6e40f65D82A0cB98795bC7587a71bfa49fBB2B;

      stakingToken = new PoLStakingToken(address(this));

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

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

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

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

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

動的価格メカニズム

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

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 ロット追跡システムを使用して、各ユーザーが最初にシェアに支払った金額の記録を維持します:

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. このプロセスは、売却されるすべてのシェアが考慮されるまで続き、最終的に totalStakeToWithdrawdelegateWithdraw を呼び出します

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

結論

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

  • 自動ステーキングdelegateStake はユーザーの PoL ステークを自動的に管理するための強力な機能です。逆に、ユーザーが退出/売却する際は delegateWithdraw を使用します
  • FIFO ロット追跡:POLTech は、シェア価格が変動しても、ユーザーのステークを正確に追跡します

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


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

最終的なコードを確認し、他のガイドを見たい場合は、POLTech Code をチェックしてください。

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

詳細をより深く理解したい場合は、Berachain Docs をご覧ください。

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

Berachain Discord サーバーに参加し、開発者チャンネルで質問してください。

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


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

【Social Links】

【お問合せ】
Sunrise へのお問い合わせはこちらから 👉 Google Form

1080x360.jpeg

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?