清算机器人,从0到1跑通全流程
本文翻译自Robert Miller的Anatomy of an MEV Strategy: Synthetix 几个月前,臭名昭著的阿尔法泄密者KALEB在Flashbots公共搜索者不和谐中,发布了以下消息:KALEB此前曾泄露了数十万美元的Alpha版本,用于对Synthetix的更改。 在这个机器人操作者的巢穴里分享阿尔法就像向狮子扔红肉一样,快速浏览一下合同,就可以确认这是一笔令人眼花缭乱的资金。 在接下来的几周里,我计划并试图执行一项策略来捕获上面分享的MEV KALEB。第一步,识别机会我不是一个Synthetix专家,因此第一步是去学习我将要涉及的操作。具体如下:我找出了相关合约我在Synthetix博客里读了它们的高级别功能并且搜索了相关文档我确保理解了将要实行的治理变动范围我查找了相关函数总结一下这阶段的工作,Synthetix已经试验了以ETH为抵押去铸造(mint)sUSD和sETH。你可以在合约中存入ETH并铸造那些资产,只要你留意你的抵押资产不要下跌到低于你铸造的资产的一定水平。(可能亏钱) 然后,在一年后,协议投票通过结束了此试验。当还有数百万差不多...
Solana的与众不同
转自推特gm365老哥 对于一个长期浸淫在 EVM (以太坊、L2、BSC、Avax等)世界的人,刚切换到 Solana 生态时,除了要换一个浏览器插件钱包、交易更便宜外,可能你会觉得两条公链差别也不是很大 但一番深入研究下来,发现二者从底层设计理念,到各个层面,几乎天差地别 这里将我前期学习了解的一些特性加以总结,帮你更快速入门 Solana ,少走一些弯路普通用户对普通用户而言, Solana 的实际差别不会特别大,具体表现可能在下面几个方面: 1、浏览器插件钱包 MetaMask 不直接支持 Solana, 你得换用 Phantom 之类,问题不大 但是,通过 MetaMask Snap 特性,安装 solflare 插件,就可以继续使用 MetaMask 了 2、交易费用极低 相对于以太坊主网动辄几刀、十几刀的 gas 费,L2 (Arbitrum, OP, zkSync Era等)上大约 $0.2 左右的 gas,即便 BNB Chain 也要 $0.1,但 Solana 上一笔交易甚至不足 $0.01,着实令人印象深刻 3、交易“偶尔”会失败 如果你用的次数较多,项目...
闪电贷学习和编写
1.什么是闪电贷?关于闪电贷的概念,网络上有很多。一句话总结就是一个区块内借款和还款同时完成。 听起来第一个想法就是:有个毛用? 对,普通情况下就是没卵用。但是没用也要去学习他。为了学习它,总得找个理由让自己打个鸡血。 emmm,想到了! 那就是发起一笔闪电贷,拿来买大房子。这样子我就可以拥有它1-12秒钟!2.和谁贷款?提供闪电贷的很多。有aave,uni,keeperdao等等。。 其他的相对复杂,就先拿keeperDao来举例吧。因为它最简单,也是yueying大佬最先开始写的。 它的合约地址是3.怎么借?知道合约地址了可以查看代码,还有去官网看说明。 最主要的函数/// @notice borrow assets from this LP, and return them within the same transaction. /// /// @param _token The address of the token contract. /// @param _amount The amont of token. /// @param _data The implem...
清算机器人,从0到1跑通全流程
本文翻译自Robert Miller的Anatomy of an MEV Strategy: Synthetix 几个月前,臭名昭著的阿尔法泄密者KALEB在Flashbots公共搜索者不和谐中,发布了以下消息:KALEB此前曾泄露了数十万美元的Alpha版本,用于对Synthetix的更改。 在这个机器人操作者的巢穴里分享阿尔法就像向狮子扔红肉一样,快速浏览一下合同,就可以确认这是一笔令人眼花缭乱的资金。 在接下来的几周里,我计划并试图执行一项策略来捕获上面分享的MEV KALEB。第一步,识别机会我不是一个Synthetix专家,因此第一步是去学习我将要涉及的操作。具体如下:我找出了相关合约我在Synthetix博客里读了它们的高级别功能并且搜索了相关文档我确保理解了将要实行的治理变动范围我查找了相关函数总结一下这阶段的工作,Synthetix已经试验了以ETH为抵押去铸造(mint)sUSD和sETH。你可以在合约中存入ETH并铸造那些资产,只要你留意你的抵押资产不要下跌到低于你铸造的资产的一定水平。(可能亏钱) 然后,在一年后,协议投票通过结束了此试验。当还有数百万差不多...
Solana的与众不同
转自推特gm365老哥 对于一个长期浸淫在 EVM (以太坊、L2、BSC、Avax等)世界的人,刚切换到 Solana 生态时,除了要换一个浏览器插件钱包、交易更便宜外,可能你会觉得两条公链差别也不是很大 但一番深入研究下来,发现二者从底层设计理念,到各个层面,几乎天差地别 这里将我前期学习了解的一些特性加以总结,帮你更快速入门 Solana ,少走一些弯路普通用户对普通用户而言, Solana 的实际差别不会特别大,具体表现可能在下面几个方面: 1、浏览器插件钱包 MetaMask 不直接支持 Solana, 你得换用 Phantom 之类,问题不大 但是,通过 MetaMask Snap 特性,安装 solflare 插件,就可以继续使用 MetaMask 了 2、交易费用极低 相对于以太坊主网动辄几刀、十几刀的 gas 费,L2 (Arbitrum, OP, zkSync Era等)上大约 $0.2 左右的 gas,即便 BNB Chain 也要 $0.1,但 Solana 上一笔交易甚至不足 $0.01,着实令人印象深刻 3、交易“偶尔”会失败 如果你用的次数较多,项目...
闪电贷学习和编写
1.什么是闪电贷?关于闪电贷的概念,网络上有很多。一句话总结就是一个区块内借款和还款同时完成。 听起来第一个想法就是:有个毛用? 对,普通情况下就是没卵用。但是没用也要去学习他。为了学习它,总得找个理由让自己打个鸡血。 emmm,想到了! 那就是发起一笔闪电贷,拿来买大房子。这样子我就可以拥有它1-12秒钟!2.和谁贷款?提供闪电贷的很多。有aave,uni,keeperdao等等。。 其他的相对复杂,就先拿keeperDao来举例吧。因为它最简单,也是yueying大佬最先开始写的。 它的合约地址是3.怎么借?知道合约地址了可以查看代码,还有去官网看说明。 最主要的函数/// @notice borrow assets from this LP, and return them within the same transaction. /// /// @param _token The address of the token contract. /// @param _amount The amont of token. /// @param _data The implem...
Share Dialog
Share Dialog

Subscribe to 想住大房子的java程序员

Subscribe to 想住大房子的java程序员
我们在编写完成闪电贷的例子之后,便可以开始编译和部署了。
不过,写程序就是这样子的,你写着写着,发现不时地可以优化一下。所以,我又要改代码了。不要紧张,改完后会自测的。反正现在也不会有测试妹子抓着你不放。
添加以下几行代码,方便测试。
// 返回某个账户的某个token的余额
function getTokenBalance(address token, address account) public view returns (uint256) {
return IERC20(token).balanceOf(account);
}
// 返回合约部署者账户中的WETH余额
function getMyWethBalance() public view returns (uint256) {
return IERC20(WETH).balanceOf(owner);
}
// 返回合约账户中的WETH余额
function getContractWethBalance(address account) public view returns (uint256) {
return getTokenBalance(account);
}
完成之后,开始进行测试。这次是真的不改代码了!
启动测试服务器。
nohup ganache-cli --fork https://eth-mainnet.g.alchemy.com/v2/申请的Key &
该命令不需要你另外再打开一个新的终端。对了,记得去以下网站申请一个测试KEY
truffle complie
truffle migrate
truffle console
3浪打完,进入控制台。
先启动一个合约实例对象。
instance = await HelloZZ.deployed();
心里有些好奇,看一下合约地址。
instance.address
也可以看一下你是谁。也就是合约的部署者。
owner = await instance.getOwner();
查询自己的余额
查询余额
myBalance = await instance.getMyWethBalance();
myBalance.toString();
虽然什么都没有,但是我相信这是一个好习惯。
向合约转50个ETH。
instance.send(web3.utils.toWei('50', 'ether'))
然后把ETH转成WETH
instance.ETHtoWETH(web3.utils.toWei('50', 'ether'));
查看合约里面的WETH余额
contractWeth = await instance.getContractWethBalance(instance.address);
contractWeth.toString();
调用合约的turnOutToken()函数,把WETH转出到所有者的钱包里
instance.turnOutToken(WETH, contractWeth)
再次检查一下你的钱包余额。
myBalance = await instance.getMyWethBalance();
myBalance.toString();
一切顺利之下,现在可以开始进行测试发起闪电贷。
result = await instance.doFlashEth(WETH, web3.utils.toWei('100'))
result
控制台会告诉你是否成功的。贷款数量也不要修改。比如你想要1000个ETH(我也想),会提示low-level call failed。该问题疑似余额不够。
OK,最后附上修改后的完整代码。还有很熟悉的一段话:如果文档和代码不相符,以代码为准[doge]
pragma solidity ^0.8.17;
import "./ExInterface.sol";
contract HelloZZ {
//** **定义一些常量 开始 **//
address WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address liquidityPool = 0x4F868C1aa37fCf307ab38D215382e88FCA6275E2;
address borrowerProxy = 0x17a4C8F43cB407dD21f9885c5289E66E21bEcD9D;
//** **定义一些常量 结束 **//
//合约的部署者
address owner;
constructor(){
owner = address(tx.origin);
}
// 返回合约的所有者
function getOwner() public view returns(address) {
return owner;
}// 返回某个账户的某个token的余额
function getTokenBalance(address token, address account) public view returns(uint256) {
return IERC20(token).balanceOf(account);
}
// 返回合约部署者账户中的ETH余额
function getMyWethBalance() public view returns (uint256) {
return IERC20(WETH).balanceOf(owner);
}
// 返回合约账户中的WETH余额
function getContractWethBalance(address account) public view returns (uint256) {
return getTokenBalance(account);
}
//把合约里面的ETH转到钱包
function turnOutETH(uint256 amount) public onlyOwner {
payable(owner).transfer(amount);
}
//把合约里面的钱转到钱包
function turnOutToken(address token, uint256 amount) public onlyOwner {
IERC20(token).transfer(owner, amount);
}
// WETH转换为ETH
function WETHToETH(uint256 amount) public onlyOwner {
IWETH(WETH).withdraw(amount);
}
// ETH转换为WETH
function ETHtoWETH(uint256 amount) public onlyOwner {
IWETH(WETH).deposit{value : amount}();
}
//发起一个eth的闪电贷
function doFlashEth(uint256 amount)public onlyOwner{
ILiquidity(liquidityPool).borrow(WETH, amount,
abi.encodeWithSelector(this.receiveBuyBigHouse.selector, abi.encode(amount)));
}
// callback ,收到钱后可以拿来买一个大房子。
function receiveBuyBigHouse(bytes memory data) public {
require(msg.sender == borrowerProxy, "bu shi BorrorwerProxy,paochu yichang.");
//购买大房子
uint256 amount = abi.decode(data, (uint256));
IERC20(WETH).transfer(liquidityPool, amount);
}
//fallback
receive() external payable {}
// modifier
modifier onlyOwner(){
require(address(msg.sender) == owner, "No authority");
_;
}
}
对了。记得帮我众筹8个核桃啊。谢谢大家。
下一节,将会带领大家玩耍闪电贷+套利。
我们在编写完成闪电贷的例子之后,便可以开始编译和部署了。
不过,写程序就是这样子的,你写着写着,发现不时地可以优化一下。所以,我又要改代码了。不要紧张,改完后会自测的。反正现在也不会有测试妹子抓着你不放。
添加以下几行代码,方便测试。
// 返回某个账户的某个token的余额
function getTokenBalance(address token, address account) public view returns (uint256) {
return IERC20(token).balanceOf(account);
}
// 返回合约部署者账户中的WETH余额
function getMyWethBalance() public view returns (uint256) {
return IERC20(WETH).balanceOf(owner);
}
// 返回合约账户中的WETH余额
function getContractWethBalance(address account) public view returns (uint256) {
return getTokenBalance(account);
}
完成之后,开始进行测试。这次是真的不改代码了!
启动测试服务器。
nohup ganache-cli --fork https://eth-mainnet.g.alchemy.com/v2/申请的Key &
该命令不需要你另外再打开一个新的终端。对了,记得去以下网站申请一个测试KEY
truffle complie
truffle migrate
truffle console
3浪打完,进入控制台。
先启动一个合约实例对象。
instance = await HelloZZ.deployed();
心里有些好奇,看一下合约地址。
instance.address
也可以看一下你是谁。也就是合约的部署者。
owner = await instance.getOwner();
查询自己的余额
查询余额
myBalance = await instance.getMyWethBalance();
myBalance.toString();
虽然什么都没有,但是我相信这是一个好习惯。
向合约转50个ETH。
instance.send(web3.utils.toWei('50', 'ether'))
然后把ETH转成WETH
instance.ETHtoWETH(web3.utils.toWei('50', 'ether'));
查看合约里面的WETH余额
contractWeth = await instance.getContractWethBalance(instance.address);
contractWeth.toString();
调用合约的turnOutToken()函数,把WETH转出到所有者的钱包里
instance.turnOutToken(WETH, contractWeth)
再次检查一下你的钱包余额。
myBalance = await instance.getMyWethBalance();
myBalance.toString();
一切顺利之下,现在可以开始进行测试发起闪电贷。
result = await instance.doFlashEth(WETH, web3.utils.toWei('100'))
result
控制台会告诉你是否成功的。贷款数量也不要修改。比如你想要1000个ETH(我也想),会提示low-level call failed。该问题疑似余额不够。
OK,最后附上修改后的完整代码。还有很熟悉的一段话:如果文档和代码不相符,以代码为准[doge]
pragma solidity ^0.8.17;
import "./ExInterface.sol";
contract HelloZZ {
//** **定义一些常量 开始 **//
address WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address liquidityPool = 0x4F868C1aa37fCf307ab38D215382e88FCA6275E2;
address borrowerProxy = 0x17a4C8F43cB407dD21f9885c5289E66E21bEcD9D;
//** **定义一些常量 结束 **//
//合约的部署者
address owner;
constructor(){
owner = address(tx.origin);
}
// 返回合约的所有者
function getOwner() public view returns(address) {
return owner;
}// 返回某个账户的某个token的余额
function getTokenBalance(address token, address account) public view returns(uint256) {
return IERC20(token).balanceOf(account);
}
// 返回合约部署者账户中的ETH余额
function getMyWethBalance() public view returns (uint256) {
return IERC20(WETH).balanceOf(owner);
}
// 返回合约账户中的WETH余额
function getContractWethBalance(address account) public view returns (uint256) {
return getTokenBalance(account);
}
//把合约里面的ETH转到钱包
function turnOutETH(uint256 amount) public onlyOwner {
payable(owner).transfer(amount);
}
//把合约里面的钱转到钱包
function turnOutToken(address token, uint256 amount) public onlyOwner {
IERC20(token).transfer(owner, amount);
}
// WETH转换为ETH
function WETHToETH(uint256 amount) public onlyOwner {
IWETH(WETH).withdraw(amount);
}
// ETH转换为WETH
function ETHtoWETH(uint256 amount) public onlyOwner {
IWETH(WETH).deposit{value : amount}();
}
//发起一个eth的闪电贷
function doFlashEth(uint256 amount)public onlyOwner{
ILiquidity(liquidityPool).borrow(WETH, amount,
abi.encodeWithSelector(this.receiveBuyBigHouse.selector, abi.encode(amount)));
}
// callback ,收到钱后可以拿来买一个大房子。
function receiveBuyBigHouse(bytes memory data) public {
require(msg.sender == borrowerProxy, "bu shi BorrorwerProxy,paochu yichang.");
//购买大房子
uint256 amount = abi.decode(data, (uint256));
IERC20(WETH).transfer(liquidityPool, amount);
}
//fallback
receive() external payable {}
// modifier
modifier onlyOwner(){
require(address(msg.sender) == owner, "No authority");
_;
}
}
对了。记得帮我众筹8个核桃啊。谢谢大家。
下一节,将会带领大家玩耍闪电贷+套利。
<100 subscribers
<100 subscribers
No activity yet