Web3 solidity编写fillorder填充订单函数 并梳理讲述逻辑

news2024/10/5 15:49:27

好 经过上文 Web3 solidity编写cancelorder取消订单函数 并梳理讲述逻辑 我们成功编写了 cancelorder 取消订单函数

其实 做了取消订单 填充订单 已经是非常简单的事了
我们还是先起来ganache 虚拟环境
在这里插入图片描述
这里 我们 模仿 orderCancel 在做一存储结构

//存储被填充订单
mapping(uint256=>bool) public orderFill;

在这里插入图片描述
在上面定义一个 mapping结构 用于存储 被填充订单
然后 除了 容器 还有一个事件
我们还是模仿之前 发布/取消订单的事件 来做一个 填充订单的事件

//记录填充订单
event Fill(uint256 id,address user,address tokenGet,uint256 amountGet,address tokenGive,uint256 amountGive,uint256 timestamp);

在这里插入图片描述
然后 我们可以直接把删除订单的代码拿过来
然后改一下 变成这样

//填充订单  方法接受一个参数  订单id  代理名叫  _id
function fillorder(uint256 _id) public {
    //根据传进来的订单id 获取到当前订单的对象
    _Order memory myorder = orders[_id];
    //判断id有没有取错
    require(myorder.id == _id);
    //将填充的数据的id 存入orderFill  值赋值为 true 表示已经填充
    orderFill[_id] = true;
    //最后 调用函数记录一下填充订单的事件
    emit Fill(myorder.id,msg.sender,myorder.tokenGet,myorder.amountGet,myorder.tokenGive,
    myorder.amountGive,block.timestamp);
}

可以看到 我们目前替换的地方 方法名 改成了 fillorder
然后 存储的容器 使用了我们刚刚定义的orderFill
然后 记录事件也改成了我们刚刚的 Fill

但是 这里还有个问题 就是 msg.sender
这个东西 拿到的是当前操作这个事件的对象 像我们 之前 发布和取消订单 可以 你用 msg.sender 因为 msg.sender对象代表的就是订单的创建者
但是 你调用填充订单 操作人 基本不可能是创建订单的人呀是不是
所以这里你用 msg.sender 肯定是有问题的 但放过来想 被调用填充订单 说明订单已经有了 那我们直接拿它原来的不就行了吗?
是不是
我们直接改成

myorder.user

在这里插入图片描述
但是 问题显然不止这一个 你没有真的进行交换呀 你不交换 这叫什么订单呀?
而 我们交易所 也可以从中获取一些燃料 这也是交易所价值所在了
这里 我们将fillorder 填充订单代码更改如下

//填充订单  方法接受一个参数  订单id  代理名叫  _id
function fillorder(uint256 _id) public {
    //根据传进来的订单id 获取到当前订单的对象
    _Order memory myorder = orders[_id];
    //判断id有没有取错
    require(myorder.id == _id);
    //将填充的数据的id 存入orderFill  值赋值为 true 表示已经填充
    orderFill[_id] = true;

    //fuelConsumption 获取消耗的燃料  比如  100转换  就  100 乘以 feePercent 再除以 100
    uint256 fuelConsumption = myorder.amountGet.mul(feePercent).div(100);

    /*
        通过msg.sender拿到当前操作用户  去掉amountGet指定的tokenGet
        加上我们计算出的燃料fuelConsumption  也要从这里去减
        这里我们设计的燃料由交易订单的人承担  你们也可设计为发布订单的人承担
        这个具体要看怎么设计逻辑
    */
    tokens[myorder.tokenGet][msg.sender] = tokens[myorder.tokenGet][msg.sender].sub(myorder.amountGet.add(fuelConsumption));
    //定订单的发起者 加上amountGet指定的  tokenGet
    tokens[myorder.tokenGet][myorder.user] = tokens[myorder.tokenGet][myorder.user].add(myorder.amountGet);

    //通过msg.sender拿到当前操作用户  加上指定的 tokenGive
    tokens[myorder.tokenGive][msg.sender] = tokens[myorder.tokenGive][msg.sender].add(myorder.amountGive);
    //定订单的发起者 去掉tokenGive指定的amountGive
    tokens[myorder.tokenGive][myorder.user] = tokens[myorder.tokenGive][myorder.user].sub(myorder.amountGive);
    
    //feeAccout我们初始化交易所时就会传进来 代表收一收获益的账号  把燃料fuelConsumption加进来
    tokens[myorder.tokenGet][feeAccout] = tokens[myorder.tokenGet][feeAccout].add(fuelConsumption);

    //最后 调用函数记录一下填充订单的事件
    emit Fill(myorder.id,myorder.user,myorder.tokenGet,myorder.amountGet,myorder.tokenGive,
    myorder.amountGive,block.timestamp);
}

我们主要是加了中间处理的逻辑
我自认为自己的注释写的挺好的
还是带着大家来读一下
首先 我们这里
在这里插入图片描述
我们定义了一个数字类型的 fuelConsumption
他是我们定义的燃料消耗 这里 我们拿到 myorder.amountGet
就是当前订单定义的消耗token
例如 我们这个订单是 100自己定义的token 转 1E
那么 这里指定的 就是 自己定义的token
然后 用它 调用mul 乘以 我们的feePercent
这个不知道大家还是否记得 之前我带大家创建交易所时 就定义了这个构造函数
他存储的就是我们的汇率
在这里插入图片描述
然后 在 div 除以 100
加上 我们是 100GRTOKEN 对 1E 交易所汇率 3
那么 这个逻辑就是 fuelConsumption = 100 乘以 3 除以 100
就是3 直接百分之三 这样看着 其实多少还是有点坑爹啊

在这里插入图片描述
然后 当前填充订单的 除了承担当前订单的值还要承担燃料 这个是发起订单的人还是 填充订单的人承担 是看我们具体自己怎么设计 大家喜欢发起订单的人自己去承担 也是没问题的

最后 feeAccout 这个我不知道大家还是否记得 他也是我们设计在构造函数中的
在这里插入图片描述
你们也可以理解为它指向的就是 交易所控制或发布者的账号指向
我们将燃料add给它
在这里插入图片描述
这些都还是在交易所的
但大大家别忘了 我们写过
在这里插入图片描述
这样 我们填充订单的方法就写好了

然后我们编译一下
在这里插入图片描述
也是没有任何问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1034770.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

追光者的梦

追光者的梦 鸿蒙中我茫然于世,你是钻入我心里的那束光 我所有的梦想都是和你热烈的拥抱 没有追到你时,我一直在路上 追到你时,我的人生就被你点燃 ——致所有的追光者 合肥先进光源国家重大科技基础设施项目及配套工程启动会刚开过&…

go学习之数组与Map

文章目录 一、数组1.为什么需要数组2.数组快速入门3、数组的定义和内存布局数组的使用数组的遍历数组的注意事项和细节数组的应用案例 4.slice切片1.基本介绍2.切片使用的三种方式way1way2way3 3.切片的注意事项4.string和slice 5.二维数组1.排序1)排序的基本介绍2&…

uni-app实现获取未来七天时间和星期几功能

例子如下&#xff1a; HTML&#xff1a; <viewstyle"margin-top: 3%;width: 100%;height: 10vh;display: flex;justify-content: space-around;"><div v-for"(item,index) in same_week" :class"[same_dayitem.date? activ :,dis]"cl…

在虚拟机上安装win10/ubuntu的教程

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 一、下载软件资源 1、首先下载虚拟机Vmware_Pro17软件并正确安装&#xff1a;网盘链接 2、然后下载操作系统的镜像文件&#xff1a;MSDN, 我告诉你 - 做一个安静的工具站 二、在虚拟机上安装ubuntu系统 1…

EXP武器库编写

文章目录 pocsuite3工具SQL注入EXP布尔盲注优化最终优化 延时注入 phpstudy2016-2018-RCE利用DVWA文件上传metinfo_5.0.4EXPSQL-布尔盲注文件包含漏洞 定制SQLmaptamper脚本sqli-labs/less-26关卡分析 tamper脚本编写 python是黑客最喜欢的编程语言之一&#xff0c;但同时go语言…

基于AVR128单片机智能电风扇控制系统

一、系统方案 模拟的电风扇的工作状态有3种&#xff1a;自然风、常风及睡眠风。使用三个按键S1-S3设置自然风、常风及睡眠风。 再使用两个按键S4和S5&#xff0c;S4用于定时电风扇定时时间长短的设置&#xff0c;每按一次S4键&#xff0c;定时时间增加10秒&#xff0c;最长60秒…

C/C++程序员技术发展方向(强烈推荐!!)

大家好&#xff0c;我是阿Q。 今天这篇就是专门给现在还迷茫不知道自己到底要做什么方向C开发的同学们。 几年后回过头看的时候&#xff0c;你一定会感谢当初那个努力的自己&#xff01; C作为当下也非常流行的一个面向对象语言&#xff0c;有着非常多的应用&#xff0c;一定…

RHCSA 文件的上传下载(Linux-Windows)

目录 一、SCP 上传&#xff08;Windows--->Linux&#xff09;&#xff1a; 下载&#xff08;Linux--->Windows&#xff09;&#xff1a; 二、STFP 三、XFTP工具 一、SCP 上传&#xff08;Windows--->Linux&#xff09;&#xff1a; 在Windows本地端命令窗口中转…

基因组注释(Annotation)

基因组组装完成后&#xff0c;或者是完成了草图&#xff0c;就不可避免遇到一个问题&#xff0c;需要对基因组序列进行注释。注释之前首先得构建基因模型&#xff0c;有三种策略&#xff1a; 从头注释(de novo prediction)&#xff1a;通过已有的概率模型来预测基因结构&#…

【刷题】2023年第十四届蓝桥杯大赛软件类省赛C/C++大学A组真题

蓝桥杯2023年第十四届省赛真题-平方差 - C语言网 (dotcpp.com) 初步想法&#xff0c;x y2 − z2&#xff08;yz)(y-z) 即xa*b&#xff0c;ayz&#xff0c;by-z 2yab 即ab是2的倍数就好了。 即x存在两个因数之和为偶数就能满足条件。 但时间是&#xff08;r-l&#xff09;*x&am…

C语言回调函数与注册函数的使用

概述 在项目中&#xff0c;经常见到此写法&#xff0c;在此写个demo&#xff0c;方便其他工程师参阅。 开发环境&#xff1a;Visual Studio Community 2022 1、代码 #include <stdio.h>//封装库代码 typedef struct {bool status;void (*setStatus)(int status); }T_…

动手吧,vue单选框

单选框到处可见&#xff0c;组件库不方便自定义样式&#xff0c;还是自己写吧。 效果图&#xff1a; 1、template部分 <template><labelclass"v-radio flex":class"[{ disable: disabled }]":aria-disabled"disabled"><spancla…

如何搭建专属的物联网私有云?需要考虑哪些因素?

随着物联网技术的快速发展&#xff0c;越来越多的企业开始意识到搭建专属的物联网私有云的重要性。私有云是指企业自主建设和管理的云服务环境&#xff0c;其中企业可以实现对数据和服务的全面控制&#xff0c;同时也可以享受云服务的高效性和灵活性。 一、企业做专属物联网私…

基于jenkins+k8s实现devops

1、背景 由于jenkins运行在k8s上能够更好的利用动态agent进行构建。所以写了个部署教程&#xff0c;亲测无坑 2、部署 1、创建ns kubectl create namespace devops 2、kubectl apply -f jenkins.yml apiVersion: v1 kind: ServiceAccount metadata:name: jenkinsnamespace…

用于图像分类的预训练模型(PyTorch实现)

用于图像分类的预训练模型&#xff08;PyTorch实现&#xff09; 在本文中&#xff0c;我们将介绍一些使用 TorchVision 模块中存在的预训练网络的实践示例——用于图像分类的预训练模型。 1. 基于预训练模型进行图像分类 预训练模型是在 ImageNet 等大型基准数据集上训练的神…

力扣刷题-链表-移除链表元素

203.移除链表元素 题意&#xff1a;删除链表中等于给定值 val 的所有节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&#xff1a;head [], val 1 输出&#xff1a;[] 示例 3&#xff1a; 输…

arduino u8g2 表情字库制作

U8G2 下载原代码 &#xff1a; GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2 1.制作图片 使用FLASH 或任何可以画图的软件制作动态图片PNG格式 大小最好先设定好如40x80 ,最好不要太大 128X64,60X60 将制作好的图片放入 下载好的 u8g2-master…

【每日一题】1539. 第 k 个缺失的正整数

1539. 第 k 个缺失的正整数 - 力扣&#xff08;LeetCode&#xff09; 给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。 请你找到这个数组里第 k 个缺失的正整数。 示例 1&#xff1a; 输入&#xff1a;arr [2,3,4,7,11], k 5 输出&#xff1a;9 解释&#xff1a;缺失…

国科大体系结构习题 | 第二章 计算机系统结构基础

第二章 习题汇总 Q1. 在3台不同指令系统的计算机上运行同一程序P时&#xff0c;A机需要执行 1.0 1 0 8 1.010^8 1.0108条指令&#xff0c;B机需要执行 2.0 1 0 8 2.0 10^8 2.0108条指令&#xff0c;C机需要执行 4.0 1 0 8 4.010^8 4.0108条指令&#xff0c;但实际执行时间…

Linux 操作技巧

目录 一、shell-命令解释器 二、Linux中的特殊符号 三、命令历史--history 一、shell-命令解释器 shell——壳&#xff0c;命令解释器&#xff0c;负责解析用户输入的命令 ——内置命令&#xff08;shell内置&#xff09; ——外置命令&#xff0c;在文件系统的某个目录下&…