Fomo3D:stateofthedapps:fomo3d
源码结构:
.
├── Divies.sol
├── F3Devents.sol
├── F3DexternalSettings.sol
├── FoMo3Dlong.sol
├── Hourglass.sol
├── JIincForwarder.sol
├── PlayerBook.sol
├── TeamJust.sol
├── interface
│ ├── DiviesInterface.sol
│ ├── F3DexternalSettingsInterface.sol
│ ├── HourglassInterface.sol
│ ├── JIincForwarderInterface.sol
│ ├── JIincInterfaceForForwarder.sol
│ ├── PlayerBookInterface.sol
│ ├── PlayerBookReceiverInterface.sol
│ ├── TeamJustInterface.sol
│ └── otherFoMo3D.sol
├── library
│ ├── F3DKeysCalcLong.sol
│ ├── F3Ddatasets.sol
│ ├── MSFun.sol
│ ├── NameFilter.sol
│ ├── SafeMath.sol
│ └── UintCompressor.sol
└── modularLong.sol
这么多文件,其实核心的合约就几个。在以太坊网络上的合约地址查询,只有几个核心合约 FoMo3Dlong、PlayerBook、Divies、JIincForwarder,这里都是网上的人整理拆分的。
游戏核心代码:
-
JIincForwarder.sol
用于向项目基金转账 -
Divies.sol
负责跟以前P3D的合约通信,把部分游戏的收益,返给P3D的持有者。用于Fomo3D分红 -
PlayerBook.sol
主要负责玩家数据的管理,特别是推广员系统,主要在这里面 -
FoMo3Dlong.sol
主合约,玩家下注买key就是调用这个合约的接口操作 -
TeamJust.sol
用作合约的权限控制,类似于以太猫的CEO,COO,CFO。
其他有意思的类库:
-
MSFun.sol
用于做多重签名的 -
SafeMath.sol
安全的算术,用于防止变量溢出
FoMo3Dlong
构造函数定义了团队分配比例,团队为:0 = whales
、1 = bears
、2 = sneks
、3 = bulls
,定义了Team Fee和Pot Split的分配比例。
接下来的函数修饰符是为了安全校验:
- isActivated:用于确保没有人可以与合约交互,直到它被激活;
- isHuman:防止合约与fomo3d交互,检查地址的code size,如果为0表示不是合约地址;
- isWithinLimits:设置传入tx的边界[1000000000,100000000000000000000000]。
PlayerBook
构造函数定义了4个开发者的信息。
接下来的函数修饰符是为了安全校验:
- isHuman:防止合约与fomo3d交互,检查地址的code size,如果为0表示不是合约地址;
- onlyDevs:只有开发者可调用;
- isRegisteredGame:需是已注册游戏;
- checkIfNameValid:检查name是否有效。
核心函数:
- registerNameCore:注册一个名字,填充玩家的信息。
JIincForwarder
其目的主要是为了把用户投入的eth进行转移,转移到“公司银行”。下面是这个合约中包含的几个函数:
-
deposit:存款,用户存入eth,然后会转入到
currentCorpBank_
。 -
status:查看状态,主要是定义的属性:
currentCorpBank_
、newCorpBank_
、needsBank_
; -
startMigration:开始迁移,转移到
newCorpBank
; - cancelMigration:取消迁移;
- finishMigration:完成迁移;
- setup:初始化配置,设置现在的“公司银行”。
Divies
有一个核心函数distribute
,其他都是辅助函数。主要用于Fomo3D分红。
TeamJust
构造函数定义了5个admin和dev账户,而且至少需要其中一个签名才有效。
函数修饰符:
- onlyDevs:只有开发者可调用;
- onlyAdmins:只有管理员可调用。
核心函数:
- addAdmin:添加管理员(onlyDevs);
- removeAdmin:移除管理员(onlyDevs);
- changeRequiredSignatures:更改所需签名的数量,必须在1到管理员总数之间(onlyDevs);
- changeRequiredDevSignatures:更改所需开发者签名的数量,必须在1到开发者总数之间(onlyDevs)。
Interfaces
Interface
的大量使用,去拆解合约。通过传入合约地址的方式,实现合约的互调。
- DiviesInterface:Divies的接口,只有一个deposit(),用于存款。
- F3DexternalSettingsInterface:F3DexternalSettings的接口,用于一些外部设置。
-
HourglassInterface:Hourglass的接口,关于P3D token的一些操作函数,比如,
buy
、sell
、reinvest
、withdraw
、transfer
、exit
等。 - JIincForwarderInterface:JIincForwarder的接口(旧的,已过时)
-
JIincInterfaceForForwarder:JIincForwarder的接口,两个函数
deposit
、migrationReceiver_setup
。 - otherFoMo3D:只有一个函数potSwap,用于主合约FoMo3Dlong。
-
PlayerBookInterface:PlayerBook的接口,用于注册或获取玩家的信息,如
getPlayerID
、getPlayerName
、getPlayerAddr
、registerNameXIDFromDapp
、registerNameXaddrFromDapp
、registerNameXnameFromDapp
等。 -
PlayerBookReceiverInterface:接收玩家信息,
receivePlayerInfo
、receivePlayerNameList
。 - TeamJustInterface:TeamJust的接口,主要与合约权限控制有关。
Library
-
F3Ddatasets:包含几个数据结构体:
EventReturns
、Player
、PlayerRounds
、Round
、TeamFee
、PotSplit
。 -
F3DKeysCalcLong:包含几个与密钥有关的函数方法:
- keysRec:计算收到X eth的keys数;
- ethRec:计算如果你卖了X个keys所收到的eth;
- keys:计算在给定eth的情况下存在多少个keys;
- eth:计算出给定keys后,在合约中eth会有多少。
- MSFun:多重签名相关的库
import "./MSFun.sol";
MSFun.Data private msData;
function functionName()
{
if (MSFun.multiSig(msData, required signatures, "functionName") == true)
{
MSFun.deleteProposal(msData, "functionName");
// put function body here
}
}
- NameFilter:名字过滤器,过滤掉不符合规则的名字,保留符合规则的名字。
-
SafeMath:安全的算术函数,
mul
、div
、sub
、add
、sqrt
、sq
、pwr
。 - UintCompressor:关于Unit的操作函数。
定价与红利的代码分析
供给曲线:
(sqrt(keys * a + b^2) - b) / c
在Fomo3D中,有一个早期的ICO阶段,每个人都以相同的平均价格进入市场。
function keys(uint256 _eth) internal pure
returns(uint256) {
return ((((((_eth).mul(1000000000000000000)).mul(312500000000000000000000000)).add(5624988281256103515625000000000000000000000000000000000000000000)).sqrt()).sub(74999921875000000000000000000000)) / (156250000);
}
斜率eth=0是13333.3 keys / eth。
投资1eth时生成的keys数量略低于斜率
nkeys[1] / 1000000000000000000
=> 13153.1
重要功能
- function core():更新游戏状态,并分配股息。
- function keys():Fomo3D供应曲线。密钥总供应量与投入的ETH总供应量。
- function updateMasks():更新跟踪已分配多少股息的状态变量。