Polymarket 费率计算
原始数据
交易 hash: https://polygonscan.com/tx/0x0b597cb7a20fe2eeab1bf1b9266b9b10dbb10222b715b544a385fcd0dc8ef308
假设现在订单簿上报价:
| role | side | token | price | amount | yes-price |
|---|---|---|---|---|---|
| maker | buy | no | 0.41 | 5 | 0.59 |
| maker | buy | no | 0.40 | 5 | 0.60 |
我挂 buy-yes 市价 $3.27 买入会发生什么?
最终链上成交记录:
| role | side | token | maker_filled | taker_filled | fee |
|---|---|---|---|---|---|
| maker | buy | no | 2.050000 | 5.000000 | 0.000000 |
| maker | buy | no | 0.213333 | 0.533332 | 0.000000 |
| taker | buy | yes | 3.269999 | 5.533332 | 0.066870 |
撮合过程
- 我的预算是 ,市价订单系统自己估算价格和数量
- 首先 59C 一档全部吃下
- 60C 吃下一部分, (保留 6 位小数)
- 我的方向是 buy 对手方向是 sell,这个时候可以撮合成功的份额是
- 实际上少了
对手方向不对称
但是因为 polymarket 订单簿是合并 Yes/No 之后的订单簿,我 buy yes 是可以和对手的 buy no 进行撮合。
处理规则如下:
- 我出多少钱,最多能铸造多少份额 Token
- 铸造这些 Token 对手需要付多少钱,抹零一次
- 对手抹零后的钱可以实际铸造多少 Token(实际撮合数量)
- 铸造这些 Token 对手需要花多少钱
- 通过对方花钱,反推我需要花多少钱,然后抹零(我方实际支持金额)
- 上一步抹零的钱转移到对手身上,重新计算对手花多少钱(对手实际支出金额)
对手的 buy-no 其实包含着一种 USDC=>Token 的转换,可以查看官方 SDK 订单构建的时候,会有两个参数:makerAmount/takerAmount。
合约就是输入 USDC 换取 NO。这个比例记作 λ。
若是我吃下 ,交易的时候,我收到 Yes Token,对手也会收到这么多 No Token,所以对手需要支付金额 。
因为我们合伙出钱把一个 1 x USDC => 1 x No + 1 x Yes
对手支付了 的 USDC 可以获取到 数量的 No Token。 因为
转换一下就是:
代入数值计算
以 maker 的视角进行计算,抹去小数点后六位,所以最终份额是 不是 。
份额对手预计支付 ,反推我预计支付,我这边抹零到对手身上。
实际结算不适用浮点数,使用整数,所以你会看到各种小数保留后六位。
上面实际是成交份额 ,我预计支付的金额:
但是后面 结算时候不能有这样的小数存在,所以在抹零换算一次换算到对手身上:
手续费计算
手续费计算公式, 是交易份额, 和 是 Yes/No 的价格, 是收费比例,这里采用 。
收费比例不是固定的,根据市场有些是 。
手续费逐笔计费,最后合计,并且合计结果保留 5 位小数
那么第一笔收费为:
第二笔收费:
合并之后保留 5 位小数:
其他
这次随便找了一个链上数据做校对,内容写的有点粗糙,大体上流程没有错误。
双方动作都是 Buy 的时候就是我和对手各自出钱铸造 Token,双方都是都是 Sell 的时候两边的 Token 合并成为 USDC,然后再分钱。