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]);

  }

相关文章
|
9月前
|
存储 监控 调度
云服务器成本优化深度解析与实战案例
本文深入探讨了云服务器成本优化的策略与实践,涵盖基本原则、具体策略及案例分析。基本原则包括以实际需求为导向、动态调整资源、成本控制为核心。具体策略涉及选择合适计费模式、优化资源配置、存储与网络配置、实施资源监控与审计、应用性能优化、利用优惠政策及考虑多云策略。文章还通过电商、制造企业和初创团队的实际案例,展示了云服务器成本优化的有效性,最后展望了未来的发展趋势,包括智能化优化、多云管理和绿色节能。
|
9月前
|
存储 自然语言处理 关系型数据库
元宇宙游戏系统开发规则说明及源码示例
元宇宙游戏是一个多用户参与的虚拟世界,支持社交、交易、娱乐等活动。本文介绍了其开发规则,包括目标设定、用户管理、虚拟世界构建、社交互动、经济系统等内容生成及数据分析等关键环节,并提供了简化的用户注册和登录功能代码示例。
|
10月前
|
存储 安全 前端开发
数字货币交易所系统开发技术方案规则
数字货币交易所系统的开发涉及市场调研、功能需求、性能与安全、技术选型、系统设计、通信数据流、开发实现及测试调优等多个环节。本文档概述了各环节的关键技术方案和规则,旨在指导开发者构建高效、安全的数字货币交易平台。
|
10月前
|
机器学习/深度学习 监控 API
合约量化/秒合约/永续合约对冲系统开发技术规则及源码示例
合约量化、秒合约、永续合约对冲系统的开发涉及策略编写、数据处理、交易执行、风险管理等关键技术。量化策略基于市场数据和机器学习,实现自动交易;秒合约强调高速交易和风险控制;永续合约通过资金费率机制平衡多空持仓。系统需具备高效的数据处理能力和实时监控功能,以确保交易的稳定性和安全性。
|
10月前
|
监控 安全 前端开发
现货期权交易所开发技术规则及案例说明
现货期权交易所开发源码包含交易、行情、结算、风险控制和信息安全五大功能。支持交易品种上市、实时行情发布、资金结算、异常交易监测等,确保交易的公平性、高效性和安全性。案例中采用Spring Boot、Vue.js等技术,实现期权合约买卖、行情展示等功能,经过全面测试和优化后上线运营。
|
10月前
|
存储 前端开发 Oracle
swap去中心化交易所系统开发逻辑设计及源码示例
在开发去中心化交易所(DEX)的Swap系统时,逻辑设计至关重要,涉及系统架构、核心模块和交易流程等关键环节。系统分为前端界面、后端服务和区块链层,涵盖用户管理、交易处理和智能合约等功能。本文还提供了使用Solidity编写的Swap智能合约的简化示例,展示了代币兑换的基本逻辑。
|
10月前
|
前端开发 安全 关系型数据库
秒合约系统/开发模式规则/技术架构实现
秒合约系统是一种高频交易平台,支持快速交易、双向持仓和高杠杆。系统涵盖用户注册登录、合约创建与编辑、自动执行、状态记录、提醒通知、搜索筛选、安全权限管理等功能。交易规则明确,设有价格限制和强平机制,确保风险可控。技术架构采用高并发后端语言、关系型数据库和前端框架,通过智能合约实现自动化交易,确保安全性和用户体验。
|
9月前
|
UED
私域电商平台爆款模式开发规则分析-链动2+1模式
链动2+1模式是私域电商中的一种创新分销策略,通过“分享+邀请”机制,设定代理和老板两种身份,结合直推奖、见点奖等多种奖励,促进用户裂变,快速扩大用户规模,同时通过走人留人机制维持团队稳定,确保合规性和用户体验。
|
9月前
|
UED
链动2+1模式开发规则分析:独特机制实现快速裂变
链动2+1模式是一种基于私域或社交电商的商业模式,通过“分享+邀请”机制设定代理和老板两种身份,结合直推奖、见点奖等多种奖励,促进用户裂变,快速扩大用户规模,同时确保团队稳定和用户体验。该模式规则简单,易于理解,具有快速裂变拓客、低门槛高收益及合规性保障等优势。
|
人工智能 自然语言处理 API
如何使用ModelScope-Agent快速搭建一个火爆全网的哄哄模拟器
前不久,一个爆火的基于大语言模型的应用“哄哄模拟器”在QQ群爆火了,通过文字聊天的方式,模拟在各种吵架场景中如果哄好女友,女友是由AI扮演,包含了数值系统和虚拟伴侣的文本对话能力。