一文看懂 Pauly 究竟是傻子还是天才

一文剖析 $PNDX 究竟是一个精心设计的 rug 盘还是 @Pauly0x 不懂合约而诞生的失败产物。我们会从以下三个方向去解析究竟 $PNDX 发生了什么让它成为了全网土狗资金收割机

  1. $PNDX 原本应该是什么样的

  2. 合约内发生了什么

  3. $PNDX launch 后发生了什么?


$PNDX 应该是什么?

$PNDX 原本应该是一个 $PEPE lp 挖矿产出的矿币,官网界面其实通俗来说就是帮你去买 $PEPE 然后组 lp 丢矿池里挖矿。但它的机制与普通的 lp 挖矿又不相同,普通的 lp 挖矿一般是根据 lp 锁定量以及线性释放量来确定矿币奖励,但 $PNDX 则是直接根据 lp 数量来一次性释放所有奖励。

关于 $PNDX 设计初衷就是矿币的证据除了合约代码以外在网站上也能找到相关内容,例如故意做成与背景同色的白体字让用户难以察觉的图1以及藏在用户条款内的图2。 这时候就有疑问了,既然 $PNDX 是一次性释放的矿币,那么为什么我不能提了钱再买再砸呢?这就涉及到第二个问题:合约内发生了什么?

图1
图1
图2
图2

合约里发生了什么?

那么合约内究竟发生了什么?为什么合约在没有 owner 和代码硬编码地址的情况下矿池里锁定的 $PEPE$WETH 全部精准转移到了 Pauly 的个人多签钱包去? 首先,挖矿的合约里是明确有 claim 方法的,但是没有一个人能够成功调用这个方法来提币,原因就出在 rig.blockno 这个参数一直为0导致提款被拒绝。

那么既然合约没有 owner ,我们是不是可以自己去更改 rig.blockno 来提前提款 $PEPE 呢?答案是肯定的,合约里有两个函数可以更改 blockno,一个是 finalizeBlock 另一个是 bribeForLevelReward,但是不管哪个函数在最后都会调用一个叫做 _observeVirtualPoolCardinality 的私有函数。

那么这个 _observeVirtualPoolCardinality 函数做了什么呢?我们可以在下图中看到这个函数非常直接了当地把合约里所有本来应该被用户 claim 的 $PEPE$WETH 直接转到了一个叫做 DISTILLERY 变量下的地址,但是在 source code 里搜索 0x 相关内容或者在合约状态中也完全找不到这个变量相关地址

post image

那么这个叫 DISTILLERY 的地址是从哪来的呢?这时就需要注意函数创建时的 constructor ,可以看到 constructor 定义了各种代币合约和 DISTILLERY 等变量,那么这个变量就是在合约创建的时候就被定死了。如下图 Pauly 在创建合约的时候将 DISTILLERY 设置为了 17CC6042605381c158D2adab487434Bde79Aa61C

到这里可以得出来一个结论,只要 $PEPE 的提款功能一开通,所有的资产就会自动被转移到 Pauly 的私人多签钱包中,基本可以断定这就是 Pauly 有计划的 rug。 但是在 rug 之前代币 launch 的那一个小时发生了什么?为什么出现了 dex 上条形码式的 k 线?

Launch 后发生了什么?

条形码 k 线的出现原因其实很简单,主要原因就是卖盘币的数量大到可以无限掏池子,但还需要有大量的买盘资金才能画出条形码。官网无法访问从某种意义上让更多用户只能在 dex 上进行购买,带来了大量的买盘资金,再加上可以无需授权直接转走其他钱包的代币也造成了mev机器人被迫买入进一步推高买盘资金。

那么到现在已经可以下一个结论:Pauly 不是不懂合约,而是太懂合约和 rug,看似无厘头的合约问题都在给 Pauly 提供套利机会。$PNDX 的存在意义就是给新的 rug 土狗盘提供了一个不需要把隐藏 owner 硬编码在 source code 里的路子,更提升了以后代币自动安全检测的难度。