最近的池子 profit 的 dune 查询:https://dune.com/queries/2513483
池子收益看板: https://tools.defieye.io/superset/dashboard/azuro/?standalone=true
合約地址#
以 Polygon 代碼為例
Oracle 0x94429f3d92ad38c70e44218460a97021548d17ad
LP 0x7043E4e1c4045424858ECBCED80989FeAfC11B36
Core1 0x3B182e9FbF50398A412d17D7969561E3BfcC4fA4 代碼 Core
Core2 0xbb13f8981cefd19ddc5338f0f1e11de45e8a11ca 代碼 BetExpress 是對 Core1 的組合投注
LP.addReserve#
傳入 gameId, lockedReserve, finalReserve, leaf
profit = finalReserve-lockedReserve
profit>0 的時候只分發給 leaf 之前的節點
profit<0 的時候所有 LP 提供者都要虧錢
所以如果你想投入資金,建議先看看當前的 locked 資金佔總體的比例,這個比例就是你投入後短時間內面臨的最大虧損(因為在這段時間內 lockedReserve 可能被消耗就是 LP 全體虧錢,但如果賺錢了不會分給你)
Core1._calcReserve#
max( abs(reinforcement-funds[0]), abs(reinforcement-funds[1]) )
就是 LP 對這個 condition 最大可能的虧損,所有 condition 加在一起就是 LP 的 locked
Core1.resolveCondition#
只在 Core1 裡有
所有的 condition 都是只有兩方的,outcomeIndex 要麼 0 要麼 1
假設 0 贏了,那麼池子可以獲得多少資金呢?應該是 1 投入的資金減去需要支付給 0 的 payout
所以這裡有:
lockedReserve = _calcReserve(reinforcement, funds);
profitReserve = lockedReserve + funds[oppositeIndex] - reinforcement;
addReserve(condition.gameId, lockedReserve, profitReserve, condition.leaf)
可以看出在這裡池子的利潤就是funds[oppositeIndex] - reinforcement;
就是失敗用戶投入的本金部分減去了盈利用戶賺取的部分,因為 funds 默認值從 reinforcement 開始,用戶本金增加他所在方的 funds,扣除賠率放大後的對手方 funds
LP.bet#
這個是 Core1 的
用戶將 USDT 給 LP 然後進入到 Core.putBet
根據當前 virtualFunds、用戶投入的 amount 數量和配置的 margin 來更新滑點 CoreTools.calcOdds
這個交易裡用戶對 0 下注 2u,funds 和 virtualFunds 都是 0 這一方增加 2u,對手方 1 減少本金乘以賠率 2*1.219464097168=2.438928u
Core2 的 betData 是SubBet[] memory subBets, uint64 minOdds
LP.withdrawPayout#
會先進入 Core.resolvePayout
Core1 就直接返回 NFT 的持有者和 viewPayout 的結果
但 Core2 還會調用 lp.addReserve 從池子裡面扣錢