Uniswap去中心化交易所流动性挖矿开发功能丨Uniswap去中心化交易所流动性挖矿系统开发详细方案及代码分析

简介:   Web3.0:指移动互联网后下一阶段的互联网生态,主要通过区块链等技术手段实现去中心化的网络形式,实现可以模拟现实世界感受,能够打破虚拟与现实边界的互联网。

  Web3.0:指移动互联网后下一阶段的互联网生态,主要通过区块链等技术手段实现去中心化的网络形式,实现可以模拟现实世界感受,能够打破虚拟与现实边界的互联网。

  Web1.0→Web2.0→Web3.0

  Web1.0是Web的“可读取”阶段,用户之间的互动是有限的,就像早期的桌面网页;

  Web2.0是Web的“可交互”阶段,用户可以与网站或其他人进行交互和互动,就是如今的社交网络、移动网络、云计算等;

  Web3.0是网络的“可执行”阶段,计算机可以像人类一样解释信息,然后为用户生成个性化内容,如今正在大力发展的人工智能、边缘计算等。

  UniswapV2ERC20解析

  UniswapV2ERC20的接口实现合约如下:

  contract UniswapV2ERC20 is IUniswapV2ERC20{

  using SafeMath for uint;

  string public constant name='Uniswap V2';

  string public constant symbol='UNI-V2';

  uint8 public constant decimals=18;

  uint public totalSupply;

  mapping(address=>uint)public balanceOf;

  mapping(address=>mapping(address=>uint))public allowance;

  bytes32 public DOMAIN_SEPARATOR;

  //keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

  bytes32 public constant PERMIT_TYPEHASH=0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

  mapping(address=>uint)public nonces;

  event Approval(address indexed owner,address indexed spender,uint value);

  event Transfer(address indexed from,address indexed to,uint value);

  constructor()public{

  uint chainId;

  assembly{

  chainId:=chainid

  }

  DOMAIN_SEPARATOR=keccak256(

  abi.encode(

  keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),

  keccak256(bytes(name)),

  keccak256(bytes('1')),

  chainId,

  address(this)

  )

  );

  }

  function _mint(address to,uint value)internal{

  totalSupply=totalSupply.add(value);

  balanceOf[to]=balanceOf[to].add(value);

  emit Transfer(address(0),to,value);

  }

  function _burn(address from,uint value)internal{

  balanceOf[from]=balanceOf[from].sub(value);

  totalSupply=totalSupply.sub(value);

  emit Transfer(from,address(0),value);

  }

  function _approve(address owner,address spender,uint value)private{

  allowanceowner=value;

  emit Approval(owner,spender,value);

  }

  function _transfer(address from,address to,uint value)private{

  balanceOf[from]=balanceOf[from].sub(value);

  balanceOf[to]=balanceOf[to].add(value);

  emit Transfer(from,to,value);

  }

  function approve(address spender,uint value)external returns(bool){

  _approve(msg.sender,spender,value);

  return true;

  }

  function transfer(address to,uint value)external returns(bool){

  _transfer(msg.sender,to,value);

  return true;

  }

  function transferFrom(address from,address to,uint value)external returns(bool){

  if(allowancefrom!=uint(-1)){

  allowancefrom=allowancefrom.sub(value);

  }

  _transfer(from,to,value);

  return true;

  }

  function permit(address owner,address spender,uint value,uint deadline,uint8 v,bytes32 r,bytes32 s)external{

  require(deadline>=block.timestamp,'UniswapV2:EXPIRED');

  bytes32 digest=keccak256(

  abi.encodePacked(

  'x19x01',

  DOMAIN_SEPARATOR,

  keccak256(abi.encode(PERMIT_TYPEHASH,owner,spender,value,nonces[owner]++,deadline))

  )

  );

  address recoveredAddress=ecrecover(digest,v,r,s);

  require(recoveredAddress!=address(0)&&recoveredAddress==owner,'UniswapV2:INVALID_SIGNATURE');

  _approve(owner,spender,value);

  }

  }

  首先为unit类型加上SafeMath的方法

  using SafeMath for uint;

  然后定义一些所需要变量以及常量

  //token的名字

  string public constant name='Uniswap V2';

  //token的symbol

  string public constant symbol='UNI-V2';

  //token所支持的精度

  uint8 public constant decimals=18;

  //token的总供应量

  uint public totalSupply;

  //地址与余额之间的映射

  mapping(address=>uint)public balanceOf;

  //授权交易与授权交易数额之间的映射

  mapping(address=>mapping(address=>uint))public allowance;

  //EIP712所规定的DOMAIN_SEPARATOR值,会在构造函数中进行赋值

  bytes32 public DOMAIN_SEPARATOR;

  //EIP712所规定的TYPEHASH,这里直接硬编码的keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")所得到的值

  bytes32 public constant PERMIT_TYPEHASH=0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

  //地址与nonce之间的映射

  mapping(address=>uint)public nonces;

  定义event

  //授权event

  event Approval(address indexed owner,address indexed spender,uint value);

  //交易event

  event Transfer(address indexed from,address indexed to,uint value);

  构造函数

  constructor()public{

  //当前运行的链的标识

  uint chainId;

  assembly{

  //内联汇编,获取链的标识

  chainId:=chainid

  }

  //获取DOMAIN_SEPARATOR

  DOMAIN_SEPARATOR=keccak256(

  abi.encode(

  keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),

  keccak256(bytes(name)),

  keccak256(bytes('1')),

  chainId,

  address(this)

  )

  );

  }

  铸币方法这个方法主要的目的是向某个地址发送一定数量的token。

  function _mint(address to,uint value)internal{

  totalSupply=totalSupply.add(value);

  balanceOf[to]=balanceOf[to].add(value);

  emit Transfer(address(0),to,value);

  }

  销毁方法这个方法主要的目的是销毁某个地址的所持有的token。

  function _burn(address from,uint value)internal{

  balanceOf[from]=balanceOf[from].sub(value);

  totalSupply=totalSupply.sub(value);

  emit Transfer(from,address(0),value);

  }

  授权私有方法这个方法的逻辑也非常简单,就是修改allowance对应的映射并发出event

  function _approve(address owner,address spender,uint value)private{

  allowanceowner=value;

  emit Approval(owner,spender,value);

  }

  approve授权方法直接调用的授权的私有方法,并返回true

  function approve(address spender,uint value)external returns(bool){

  _approve(msg.sender,spender,value);

  return true;

  }

  permit授权方法该方法的参数具体含义可以查询EIP2612中的定义。

  function permit(address owner,address spender,uint value,uint deadline,uint8 v,bytes32 r,bytes32 s)external{

  //检查时效时间是否超时

  require(deadline>=block.timestamp,'UniswapV2:EXPIRED');

  //构建电子签

  bytes32 digest=keccak256(

  abi.encodePacked(

  'x19x01',

  DOMAIN_SEPARATOR,

  keccak256(abi.encode(PERMIT_TYPEHASH,owner,spender,value,nonces[owner]++,deadline))

  )

  );

  //验证签名并获取签名信息的地址

  address recoveredAddress=ecrecover(digest,v,r,s);

  //确保地址不是0地址并且等于token的owner

  require(recoveredAddress!=address(0)&&recoveredAddress==owner,'UniswapV2:INVALID_SIGNATURE');

  //进行授权

  _approve(owner,spender,value);

  }

  转账私有方法该方法实现了一个转账的逻辑,具体逻辑也非常简单,就是将from对应的banlanceOf减去value,to对应的balanceOf加上value,最后发出Transferevent

  function _transfer(address from,address to,uint value)private{

  balanceOf[from]=balanceOf[from].sub(value);

  balanceOf[to]=balanceOf[to].add(value);

  emit Transfer(from,to,value);

  }

  转账方法token的拥有这直接调用的方法,将token从拥有者身上转到to地址上去

  function transfer(address to,uint value)external returns(bool){

  _transfer(msg.sender,to,value);

  return true;

  }

  授权转账方法在执行该方法之前,需要通过approve授权方法或者permit授权方法进行授权。转账之前需要确认msg.sender在allowance中是否有值,如果有值就减去对应的金额。

  function transferFrom(address from,address to,uint value)external returns(bool){

  if(allowancefrom!=uint(-1)){

  //减去对应的授权额度

  allowancefrom=allowancefrom.sub(value);

  }

  _transfer(from,to,value);

  return true;

相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
相关文章
|
3月前
|
供应链 安全 区块链
去中心化钱包代币质押项目系统开发|技术方案
对于区块链技术,普遍的认知都是它拥有极高的安全性。
|
6月前
|
JavaScript 前端开发 区块链
DAPP代币合约流动性质押分红挖矿系统开发丨技术分析
DAPP代币合约流动性质押分红挖矿系统开发丨技术分析
|
存储 算法 区块链
dapp/defi代币流动性挖矿系统开发(详情及方案)丨dapp/defi代币流动性挖矿系统开发(案例及功能)
     智能合约是运行在区块链系统可复制、共享账本上的计算机程序,可以处理信息,接收、储存和发送价值。基于区块链技术的智能合约,不仅可以发挥智能合约在成本效率方面的优势,而且可以避免恶意行为对合约正常执行的干扰。将智能合约以数字化的形式写入区块链中,由区块链技术的特性保障存储、读取、执行整个过程透明可跟踪、不可篡改。同时,由区块链自带的共识算法构建出一套状态机系统,使智能合约能够高效地运行。
|
存储 区块链
DAPP/LP/DEFI智能合约流动性质押挖矿系统开发(详细及方案)丨源码案例
智能合约事实上是由计算机代码构成的一段程序,其缔结过程是:第一步,参与缔约的双方或多方用户商定后将共同合意制定成一份智能合约;
|
5G 区块链 vr&ar
DAPP智能合约流动性质押挖矿分红开发案例版丨DAPP智能合约流动性质押挖矿分红系统开发(开发案例及源码)
The metauniverse is an immersive digital world created by the combination of virtual reality,augmented reality and the Internet.The connotation and key technologies of the metauniverse require further breaking the space-time limit(5G and the Internet of Things),real immersion(VR),and value transmi
|
区块链 索引
DAPP/LP代币智能合约流动性质押挖矿互助公排开发需求丨DAPP/LP代币智能合约流动性质押挖矿互助公排系统开发详细及方案
 以区块链为核心的数字科技可以推动信息技术服务,从而促进数字产业化;元宇宙可以创造和创新更广泛的应用场景,拉动信息消费促进产业数字化。因此,以区块链为核心的Web3.0技术体系推动形成的元宇宙数字生态,将对数字产业化和产业数字化提供有力支撑,为数字经济高质量发展打造新引擎。
|
区块链
区块链DEFI质押项目系统开发丨土狗币智能合约开发方案
This article is compiled and released by WeChaT: kaifa873, which is only for reference of project development requirements! telegram @ sleu88
142 0
|
前端开发
DAPP流动性挖矿系统丨DAPP流动性挖矿系统开发实现技术详细丨DAPP流动性挖矿开发源码流程
What is DAPP(distributed application)?   DAPP is the abbreviation of Decentralized Application,which is called distributed application/decentralized application in Chinese.Generally,different DAPPs will adopt different underlying blockchain development platforms and consensus mechanisms,or issue to
|
人工智能
DAPP流动性矿池挖矿分红开发丨DAPP流动性矿池挖矿分红系统开发详细及逻辑丨DAPP流动性矿池挖矿分行系统源码部署
  Smart contract:Smart contract is a program running on the ETH blockchain,which defines the logic behind the state changes on the blockchain.In abstract,smart contract is a rule that can be executed automatically.In real life,a contract needs to have a special execution role after the contract is f
|
区块链
uniswap丨justswap丨pancakeswap去中心化交易所流动性质押挖矿开发源码,uniswap丨justswap丨pancakeswap去中心化交易所流动性质押挖矿系统开发实现技术分析
  智能合约是基于区块链的,同时其本质是一系列代码的合集,用于自动完成某些特定的功能。由于Web 3.0网络将通过去中心化协议运行,它们将通过智能合约实现互操作、无缝集成、自动化。