DeFi流动性挖矿系统开发技术方案

DeFi是相对于传统的中心化金融而言的,它主要有三大优势:
a.有资产管理需求的个人无需信任任何中介机构,新的信任会在机器和代码上重建;
b.任何人都有访问权限,没人有中央控制权;
c.所有协议都是开源的,因此任何人都可以在协议上合作构建新的金融产品,并在网络效应下加速金融创新。
比特币等加密货币可以说是DeFi的第一阶段,第二阶段则是去中心化借贷应用。
DeFi项目拥有的8个特征:
1、金融特征:该协议必须明确针对金融应用,例如信贷市场,通证交换,衍生工具/合成资产发行或交换,资产管理或预测市场。
2、无需许可:该代码是开源的,允许任何一方无需经过第三方即可使用或在其之上进行构建
3、匿名:用户无需透露自己的身份。
4、非托管:资产不由单个第三方托管。
5、社区方式治理:单个实体不拥有升级决策和管理特权。如果有的话,必须存在一个可以信任的方法把个体权利移交给社区。
6、没有预挖,没有创始人奖励,没有私募。参与者都有相同的机会。
7、可以自证明清白,资金流向透明,系统偿付能力链上可验证。
8、项目的所有代码,包括智能合约和客户端代码都通过第三方审计。
去中心化金融和传统金融另一个不同点是透明性,去中心化金融相当的透明,因为用户的每笔交易都是通过区块完成的,其区块记录分布在全球节点上,区块具有不可篡改等特性。
流动性挖矿
目前DeFi的流动性挖矿,主要是发生在以太坊区块链上的产品,它通过为以太坊上DeFi产品提供流动性获得收益。简单来说,存入某些代币资产即可进行挖矿,之所以称为挖矿,也是沿用了比特币挖矿的行业说法。在Compound上进行流动性挖矿,主要是在上面进行存入代币或借出代币等操作,从而获得COMP治理代币的奖励。而COMP代币代表了Compound协议的治理权。COMP持有人可以投票决定Compound协议的发展方向。如果Compound业务有价值,那么COMP就有天然的治理价值

function findFreeX6Referrer(address userAddress, uint8 level) public view returns(address) {
    while (true) {
        if (users[users[userAddress].referrer].activeX6Levels[level]) {
            return users[userAddress].referrer;
        }
        
        userAddress = users[userAddress].referrer;
    }
}
    
function usersActiveX3Levels(address userAddress, uint8 level) public view returns(bool) {
    return users[userAddress].activeX3Levels[level];
}

function usersActiveX6Levels(address userAddress, uint8 level) public view returns(bool) {
    return users[userAddress].activeX6Levels[level];
}

function usersX3Matrix(address userAddress, uint8 level) public view returns(address, address[] memory, bool) {
    return (users[userAddress].x3Matrix[level].currentReferrer,
            users[userAddress].x3Matrix[level].referrals,
            users[userAddress].x3Matrix[level].blocked);
}

function usersX6Matrix(address userAddress, uint8 level) public view returns(address, address[] memory, address[] memory, bool, address) {
    return (users[userAddress].x6Matrix[level].currentReferrer,
            users[userAddress].x6Matrix[level].firstLevelReferrals,
            users[userAddress].x6Matrix[level].secondLevelReferrals,
            users[userAddress].x6Matrix[level].blocked,
            users[userAddress].x6Matrix[level].closedPart);
}

function isUserExists(address user) public view returns (bool) {
    return (users[user].id != 0);
}

function findEthReceiver(address userAddress, address _from, uint8 matrix, uint8 level) private returns(address, bool) {
    address receiver = userAddress;
    bool isExtraDividends;
    if (matrix == 1) {
        while (true) {
            if (users[receiver].x3Matrix[level].blocked) {
                emit MissedEthReceive(receiver, _from, 1, level);
                isExtraDividends = true;
                receiver = users[receiver].x3Matrix[level].currentReferrer;
            } else {
                return (receiver, isExtraDividends);
            }
        }
    } else {
        while (true) {
            if (users[receiver].x6Matrix[level].blocked) {
                emit MissedEthReceive(receiver, _from, 2, level);
                isExtraDividends = true;
                receiver = users[receiver].x6Matrix[level].currentReferrer;
            } else {
                return (receiver, isExtraDividends);
            }
        }
    }
}

function sendETHDividends(address userAddress, address _from, uint8 matrix, uint8 level) private {
    (address receiver, bool isExtraDividends) = findEthReceiver(userAddress, _from, matrix, level);

    if (!address(uint160(receiver)).send(levelPrice[level])) {
        return address(uint160(receiver)).transfer(address(this).balance);
    }
    
    if (isExtraDividends) {
        emit SentExtraEthDividends(_from, receiver, matrix, level);
    }
}

function bytesToAddress(bytes memory bys) private pure returns (address addr) {
    assembly {
        addr := mload(add(bys, 20))
    }
}

} function findFreeX6Referrer(address userAddress, uint8 level) public view returns(address) {
while (true) {
if (users[users[userAddress].referrer].activeX6Levels[level]) {
return users[userAddress].referrer;
}

        userAddress = users[userAddress].referrer;
    }
}
    
function usersActiveX3Levels(address userAddress, uint8 level) public view returns(bool) {
    return users[userAddress].activeX3Levels[level];
}

function usersActiveX6Levels(address userAddress, uint8 level) public view returns(bool) {
    return users[userAddress].activeX6Levels[level];
}

function usersX3Matrix(address userAddress, uint8 level) public view returns(address, address[] memory, bool) {
    return (users[userAddress].x3Matrix[level].currentReferrer,
            users[userAddress].x3Matrix[level].referrals,
            users[userAddress].x3Matrix[level].blocked);
}

function usersX6Matrix(address userAddress, uint8 level) public view returns(address, address[] memory, address[] memory, bool, address) {
    return (users[userAddress].x6Matrix[level].currentReferrer,
            users[userAddress].x6Matrix[level].firstLevelReferrals,
            users[userAddress].x6Matrix[level].secondLevelReferrals,
            users[userAddress].x6Matrix[level].blocked,
            users[userAddress].x6Matrix[level].closedPart);
}

function isUserExists(address user) public view returns (bool) {
    return (users[user].id != 0);
}

function findEthReceiver(address userAddress, address _from, uint8 matrix, uint8 level) private returns(address, bool) {
    address receiver = userAddress;
    bool isExtraDividends;
    if (matrix == 1) {
        while (true) {
            if (users[receiver].x3Matrix[level].blocked) {
                emit MissedEthReceive(receiver, _from, 1, level);
                isExtraDividends = true;
                receiver = users[receiver].x3Matrix[level].currentReferrer;
            } else {
                return (receiver, isExtraDividends);
            }
        }
    } else {
        while (true) {
            if (users[receiver].x6Matrix[level].blocked) {
                emit MissedEthReceive(receiver, _from, 2, level);
                isExtraDividends = true;
                receiver = users[receiver].x6Matrix[level].currentReferrer;
            } else {
                return (receiver, isExtraDividends);
            }
        }
    }
}

function sendETHDividends(address userAddress, address _from, uint8 matrix, uint8 level) private {
    (address receiver, bool isExtraDividends) = findEthReceiver(userAddress, _from, matrix, level);

    if (!address(uint160(receiver)).send(levelPrice[level])) {
        return address(uint160(receiver)).transfer(address(this).balance);
    }
    
    if (isExtraDividends) {
        emit SentExtraEthDividends(_from, receiver, matrix, level);
    }
}

function bytesToAddress(bytes memory bys) private pure returns (address addr) {
    assembly {
        addr := mload(add(bys, 20))
    }
}

}

猜你喜欢

转载自blog.csdn.net/m0_51754086/article/details/109203652