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元宇宙链游游戏系统开发功能详细/规则玩法/源码逻辑
**智能合约开发**:智能合约是 DApp 的核心,它们运行在区块链上并控制着游戏的逻辑和规则。您需要使用 Solidity 或类似的语言编写智能合约,以实现游戏中的经济系统、资产所有权和交易功能。
|
存储 安全 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盲盒抽奖游戏开发合约部署源码详情
区块链DApp盲盒抽奖游戏开发合约部署源码详情
|
新零售 人工智能 算法
农场养成种树游戏系统开发(案例项目)丨区块链DAPP种树游戏系统开发(开发案例)及源码方案
  即企业以互联网为依托,通过运用大数据、人工智能等先进技术手段,对商品的生产、流通与销售过程进行升级改造,进而重塑业态结构与生态圈,并对线上服务、线下体验以及现代物流进行深度融合的零售新模式。
|
安全 区块链
BSC链盲盒游戏系统开发详情案例丨dapp链上合约盲盒游戏系统开发方案项目/逻辑规则/成熟技术/源码功能
  DApp(去中心化应用程序)盲盒游戏系统的开发涉及到在区块链上构建和运行盲盒游戏。
|
存储 测试技术 区块链
元宇宙游戏链游系统开发(稳定版)丨nft/dapp游戏链游系统开发详情规则及源码案例
  元宇宙链游戏(Metaverse blockchain game)是基于区块链技术和元宇宙概念开发的一类游戏。
|
存储 区块链 数据安全/隐私保护
DAPP链上合约游戏系统开发技术详细丨dapp农场养成种植种树游戏项目系统开发成熟技术/规则详细/源码平台
  DAPP智能合约技术又称之为加密合约技术,是在一定的条件直接控制数字的技术,在各方之间转移的一种计算机程序。智能合约不同于传统的技术方式定义了协议处罚和规则,还定义了自动强制执行的义务。
|
安全 区块链 存储
区块链dapp哈希竞猜游戏系统开发(开发案例)丨DAPP哈希竞猜智能合约游戏系统开发规则玩法/方案详细/稳定版/源码案例
哈希函数是一种将任意长度的数据转换成固定长度的数据的过程。该过程是不可逆的,这意味着很难从哈希值还原原始数据
|
存储 负载均衡 前端开发
dapp区块链游戏开发功能版丨区块链游戏dapp链游系统开发技术方案/玩法规则/项目案例/源码程序
  区块链游戏系统开发是区块链技术在游戏领域的应用之一。通过区块链技术,游戏系统可以实现更加公平、透明、安全的游戏环境,同时提高游戏的运营效率和用户满意度。下面我们将详细介绍区块链游戏系统开发实现的技术和方案