DAPP链上盲盒游戏开发案例版丨DAPP链上盲盒游戏系统开发(案例开发)丨DAPP链上盲盒游戏源码功能

简介:  Specifically,new retail is consumer-centered,based on the digitalization of people,goods and services,supply chain and other links,connecting various consumption scenarios through data flow,including smart phones,mobile terminals,computers,physical stores,and new ways that can be realized in the fu

  Specifically,new retail is consumer-centered,based on the digitalization of people,goods and services,supply chain and other links,connecting various consumption scenarios through data flow,including smart phones,mobile terminals,computers,physical stores,and new ways that can be realized in the future,and using digital technology to realize the comprehensive integration of physical and virtual retail supply chain,transaction delivery chain,and service chain,It provides consumers with a seamless consumption experience covering all channels,and is an efficient and inclusive pan-retail business characterized by logistics distribution replacing physical delivery.

  //SWAP

  //requires the initial amount to have already been sent to the first pair

  //交易方法

  //需要先将amounts[0]的金额已经转到第一个pair地址(即path[0]+path[1]组成的pair)!

  function _swap(uint[]memory amounts,address[]memory path,address _to)internal virtual{

  for(uint i;i<path.length-1;i++){//遍历整个path

  //得到进/出token地址

  (address input,address output)=(path,path[i+1]);

  //排序得到token0

  (address token0,)=UniswapV2Library.sortTokens(input,output);

  //获取到output币种的输出量!

  uint amountOut=amounts[i+1];

  //根据token0,input得到amount0需要out,还是amount1是out,;注意其中之一一定是0,即入token的金额,不需要pair转出

  (uint amount0Out,uint amount1Out)=input==token0?(uint(0),amountOut):(amountOut,uint(0));

  //如果i小于path长度-2,就表示还需要继续交易,所以to是下一个交易对,如果一样就表示path结束了,to就是参数中的_to

  address to=i<path.length-2?UniswapV2Library.pairFor(factory,output,path[i+2]):_to;

  //调用pair的swap方法,其中一个out是0,另一个是要转出的金额,内部是转出输出量,并校验交易是否正确,更新储备量

  IUniswapV2Pair(UniswapV2Library.pairFor(factory,input,output)).swap(

  amount0Out,amount1Out,to,new bytes(0)

  );

  }

  }

  //输入精确的token,换取另一个token(输出量不确定)

  function swapExactTokensForTokens(

  uint amountIn,//输入金额

  uint amountOutMin,//最小输出金额

  address[]calldata path,//交易路径

  address to,

  uint deadline

  )external virtual override ensure(deadline)returns(uint[]memory amounts){

  //通过getAmountsOut获取整个path完整路径的输入/出量,下标0是用户实际输入额,最后一个位置是实际输出额

  amounts=UniswapV2Library.getAmountsOut(factory,amountIn,path);

  //需要满足计算得来最终输出量大于等于最小输出金额

  require(amounts[amounts.length-1]>=amountOutMin,'UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT');

  //先将amounts[0]入金额转入第一个pair!!

  TransferHelper.safeTransferFrom(

  path[0],msg.sender,UniswapV2Library.pairFor(factory,path[0],path[1]),amounts[0]

  );

  //调用内部_swap方法

  _swap(amounts,path,to);

  }

  //输入不确定数量A,换取精确输出的B(例:精确输出1个token,正常100u可以换1个token,由于发交易后其他人先交易过,导致价格变了,可能95或者105可以买1个token,95肯定交易通过,如果amountInMax是102,该交易就无法成交,回退)

  function swapTokensForExactTokens(

  uint amountOut,//精确的输出额

  uint amountInMax,//最大允许的输入量

  address[]calldata path,

  address to,

  uint deadline

  )external virtual override ensure(deadline)returns(uint[]memory amounts){

  //根据getAmountsIn计算出输入输出量

  amounts=UniswapV2Library.getAmountsIn(factory,amountOut,path);

  //需要第一个输入量小于等于计算来的实际输入量

  require(amounts[0]<=amountInMax,'UniswapV2Router:EXCESSIVE_INPUT_AMOUNT');

  //将计算得来的金额amounts[0]转入第一个pair

  TransferHelper.safeTransferFrom(

  path[0],msg.sender,UniswapV2Library.pairFor(factory,path[0],path[1]),amounts[0]

  );

  //调用内部_swap方法

  _swap(amounts,path,to);

  }

  //输入精确的eth换取不定量的token,对应swapExactTokensForTokens,不过输入的是eth,换成weth就一样了

  function swapExactETHForTokens(uint amountOutMin,address[]calldata path,address to,uint deadline)

  external

  virtual

  override

  payable

  ensure(deadline)

  returns(uint[]memory amounts)

  {

  //要求path[0]是weth地址

  require(path[0]==WETH,'UniswapV2Router:INVALID_PATH');

  //通过getAmountsOut,输入额是msg.value

  amounts=UniswapV2Library.getAmountsOut(factory,msg.value,path);

  //需要满足计算得来最终输出量大于等于最小输出金额

  require(amounts[amounts.length-1]>=amountOutMin,'UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT');

  //pair中只会存weth,没有eth

  IWETH(WETH).deposit{value:amounts[0]}();//兑换成weth

  //将weth转入到第一个pair

  assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory,path[0],path[1]),amounts[0]));

  //调用内部_swap方法

  _swap(amounts,path,to);

  }

  //输入不定量的A,换取精确的输出ETH,对应swapTokensForExactTokens,只是内部将weth转成eth再给用户

  function swapTokensForExactETH(uint amountOut,uint amountInMax,address[]calldata path,address to,uint deadline)

  external

  virtual

  override

  ensure(deadline)

  returns(uint[]memory amounts)

  {

  //path最后一个输出地址是weth

  require(path[path.length-1]==WETH,'UniswapV2Router:INVALID_PATH');

  //

  amounts=UniswapV2Library.getAmountsIn(factory,amountOut,path);

  //需要第一个输入量小于等于计算来的实际输入量

  require(amounts[0]<=amountInMax,'UniswapV2Router:EXCESSIVE_INPUT_AMOUNT');

  //将计算得来的金额amounts[0]转入第一个pair

  TransferHelper.safeTransferFrom(

  path[0],msg.sender,UniswapV2Library.pairFor(factory,path[0],path[1]),amounts[0]

  );

  //调用内部_swap方法,注意第三个参数改成了当前路由地址!

  _swap(amounts,path,address(this));

  //交换成功后,将weth转换成eth,再转给to

  IWETH(WETH).withdraw(amounts[amounts.length-1]);

  TransferHelper.safeTransferETH(to,amounts[amounts.length-1]);

  }

  //输入精确的A换取不定量的eth swapExactTokensForTokens只是输出是eth

  function swapExactTokensForETH(uint amountIn,uint amountOutMin,address[]calldata path,address to,uint deadline)

  external

  virtual

  override

  ensure(deadline)

  returns(uint[]memory amounts)

  {

  //path最后一个输出地址是weth

  require(path[path.length-1]==WETH,'UniswapV2Router:INVALID_PATH');

  //

  amounts=UniswapV2Library.getAmountsOut(factory,amountIn,path);

  //注意输出要大于最小输出

  require(amounts[amounts.length-1]>=amountOutMin,'UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT');

  //

  TransferHelper.safeTransferFrom(

  path[0],msg.sender,UniswapV2Library.pairFor(factory,path[0],path[1]),amounts[0]

  );

  //调用内部_swap方法,注意第三个参数改成了当前路由地址!

  _swap(amounts,path,address(this));

  //交换成功后,将weth转换成eth,再转给to

  IWETH(WETH).withdraw(amounts[amounts.length-1]);

  TransferHelper.safeTransferETH(to,amounts[amounts.length-1]);

  }

  //输入不定量的ETH换取精确的token输出,对应swapTokensForExactTokens,只是输入的是eth

  function swapETHForExactTokens(uint amountOut,address[]calldata path,address to,uint deadline)

  external

  virtual

  override

  payable

  ensure(deadline)

  returns(uint[]memory amounts)

  {

  require(path[0]==WETH,'UniswapV2Router:INVALID_PATH');

  amounts=UniswapV2Library.getAmountsIn(factory,amountOut,path);

  //注意,实际输入需要小于msg.value,即eth输入量

  require(amounts[0]<=msg.value,'UniswapV2Router:EXCESSIVE_INPUT_AMOUNT');

  IWETH(WETH).deposit{value:amounts[0]}();

  assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory,path[0],path[1]),amounts[0]));

  _swap(amounts,path,to);

  //refund dust eth,if any

  //如果实际不需要那么多eth,将剩余返还用户

  if(msg.value>amounts[0])TransferHelper.safeTransferETH(msg.sender,msg.value-amounts[0]);

  }

相关文章
|
8月前
|
存储 区块链
DAPP链游盲盒代币质押模式系统开发细节方案
区块链这种去中心化、防篡改的平台,完美地解决了这些问题
|
存储 安全 API
NFT/dapp卡牌链游智能合约系统开发详细指南/案例设计/规则玩法/源码项目
DApp智能合约系统开发功能是指为构建去中心化应用程序(DApp)而设计和开发的智能合约的功能。
|
安全 区块链
NFT卡牌链游系统开发详情指南(区块链游戏系统开发源码)丨NFT卡牌链游系统开发运营版/需求步骤/案例逻辑/源码说明
Requirement analysis and planning: Clarify the system's goals and functional requirements. Understand the characteristics and working methods of the NFT card chain game system. Collect user requirements, define system card rules, game modes, and transaction functions.
|
新零售 人工智能 算法
农场养成种树游戏系统开发(案例项目)丨区块链DAPP种树游戏系统开发(开发案例)及源码方案
  即企业以互联网为依托,通过运用大数据、人工智能等先进技术手段,对商品的生产、流通与销售过程进行升级改造,进而重塑业态结构与生态圈,并对线上服务、线下体验以及现代物流进行深度融合的零售新模式。
|
安全 区块链
BSC链盲盒游戏系统开发详情案例丨dapp链上合约盲盒游戏系统开发方案项目/逻辑规则/成熟技术/源码功能
  DApp(去中心化应用程序)盲盒游戏系统的开发涉及到在区块链上构建和运行盲盒游戏。
|
存储 区块链 数据安全/隐私保护
DAPP链上合约游戏系统开发技术详细丨dapp农场养成种植种树游戏项目系统开发成熟技术/规则详细/源码平台
  DAPP智能合约技术又称之为加密合约技术,是在一定的条件直接控制数字的技术,在各方之间转移的一种计算机程序。智能合约不同于传统的技术方式定义了协议处罚和规则,还定义了自动强制执行的义务。
|
存储 前端开发 安全
BSC链盲盒游戏系统开发实现技术原理丨dapp盲盒游戏系统开发案例规则/源码设计/方案项目
  智能合约:它们是存储在区块链上的计算机程序,在满足预定条件时运行,智能合约是用Solidity语言编写的
|
存储 负载均衡 前端开发
dapp区块链游戏开发功能版丨区块链游戏dapp链游系统开发技术方案/玩法规则/项目案例/源码程序
  区块链游戏系统开发是区块链技术在游戏领域的应用之一。通过区块链技术,游戏系统可以实现更加公平、透明、安全的游戏环境,同时提高游戏的运营效率和用户满意度。下面我们将详细介绍区块链游戏系统开发实现的技术和方案
|
区块链
  DAPP链上盲盒游戏系统开发(案例开发)详情
随着区块链技术的快速发展,DeFi(去中心化金融)和DApp(去中心化应用程序)成为了炙手可热的领域。
|
新零售 人工智能 JSON
NFT/DAPP盲盒游戏系统开发(开发方案),DAPP/NFT盲盒游戏系统开发(项目案例)及源码部署
新零售是线上与线下结合,组合的价值主要是线下为线上引流,降低引流投入,线下成为线上的体验店,提高转化和复购,线上和线下双渠道一起提高周转,提高效率,线上和线下虽然各自核算收入和投入,但相互之间能产生互促效应。

热门文章

最新文章

下一篇
开通oss服务