pragma solidity ^0.5.10; contract SendApplication{ address payable public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() public { owner = msg.sender; } event Transfer(address indexed _from, address indexed _to, uint256 _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId); function balanceOf(address _owner) public view returns (uint256 _balance); function ownerOf(uint256 _tokenId) public view returns (address _owner); function transfer(address _to, uint256 _tokenId) public; function approve(address _to, uint256 _tokenId) public; function takeOwnership(uint256 _tokenId) public; function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner,'Must contract owner'); _; } function transferOwnership(address payable newOwner) public onlyOwner { require(newOwner != address(0),'Must contract owner'); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } } contract Demand is SendApplication{ uint public count = 0; //需求内容,数据核心 uint public demanderCount=0; struct Demanders{ //需求者 address demanderid; //需求物品名称 string name; //需求数量 uint number; } //类型[] 公开或私有 名称,构造体 Demanders[] public demander; //数据库数据操作,起到一一对应关系 mapping(address => uint) public demandToOwner; mapping(address => uint) ownerDemandCount; event NewDemand(uint demanderId,string name,uint number); function _creatdemand(string memory _name,uint _number) public { require(demandToOwner[msg.sender]==0); //构造体推入数组,数组序号 uint id = Demanders.push(demander(_name,0,0))-1; //id赋值给发送者 demandToOwner[id] = msg.sender; //防止溢出==++ ownerDemandCount[msg.sender] = ownerDemandCount[msg.sender].add(1); demanderCount = demanderCount.add(1); //通知前端/事件 emit NewDemand(id,_name,_number); } } contract Supplies is Demand{ struct goodSales{ address supplyer; uint num; uint price; } mapping(uint => goodSales) public goodShop; mapping(uint => address) goodApprovals; uint shopGoodCount; uint public minPrice = 1 finney; event SaleGood(uint _goodId,address seller); function saleMygood(uint _goodId,uint _num,uint _price) public onlyOwnerOf(_goodId){ require(_price > minPrice,'Your price must > minprice'); goodShop[_goodId] = goodSales(msg.sender,_num,_price); shopGoodCount = shopGoodCount.add(1); emit SaleGood(_goodId,msg.sender); } function buyShopGood(uint _goodId) public payable { require(msg.value > goodShop[_goodId].price,'No enough money'); _transfer(goodShop[_goodId].supplyer,msg.sender,_goodId); } function ownerOf(uint256 _tokenId) public view returns (address _owner){ return goodToOwner[_tokenId]; } //mapping(uint => adress) goodToOwner; //mapping(adress => uint) ownergoodCount; function _transfer(address _from, address _to, uint256 _tokenId) internal { ownergoodCount[_to] = ownergoodCount[_to].add(1); ownergoodCount[_from] = ownergoodCount[_from].sub(1); goodToOwner[_tokenId] = _to; emit Transfer(_from,_to,_tokenId); } function transfer(address _to, uint256 _tokenId) public{ _transfer(msg.sender,_to,_tokenId); } function approve(address _to, uint256 _tokenId) public{ goodApprovals[_tokenId] = _to; emit Approval(msg.sender,_to,_tokenId); } function takeOwnership(uint256 _tokenId) public{ require(goodApprovals[_tokenId] == msg.sender); address owner = ownerOf(_tokenId); _transfer(owner,msg.sender,_tokenId); } } // 多重签名(钱包交易) contract qianming is Supplies{ // 交易发起者 address private owner; // 签名者 mapping (address => uint8) private managers; // 判断权限 modifier isOwner{ require(owner == msg.sender); _; } modifier isManager{ require( msg.sender == owner || managers[msg.sender] == 1); _; } // 最少需要集齐3个签名数量 uint constant MIN_SIGNATURES = 3; // 交易所引 uint private transactionIdx; // 交易结构 struct Transaction { // 发起者 address from; // 接受者 address to; // 转账数量 uint amount; // 签名数量 uint8 signatureCount; // 签名详情 mapping (address => uint8) signatures; } // 交易字典(交易ID-> tx) mapping (uint => Transaction) private transactions; // pending队列中的交易列表 uint[] private pendingTransactions; constructor() public{ owner = msg.sender; } event DepositFunds(address from, uint amount); event TransferFunds(address to, uint amount); // 创建交易事件 event TransactionCreated( address from, address to, uint amount, uint transactionId ); function addManager(address manager) public isOwner{ managers[manager] = 1; } function removeManager(address manager) public isOwner{ managers[manager] = 0; } function () public payable{ // 触发预转账事件(尚未签名) emit DepositFunds(msg.sender, msg.value); } // 发起交易入口 function withdraw(uint amount) isManager public{ transferTo(msg.sender, amount); } // 发起交易的实现 function transferTo(address to, uint amount) isManager public{ require(address(this).balance >= amount); uint transactionId = transactionIdx++; Transaction memory transaction; transaction.from = msg.sender; transaction.to = to; transaction.amount = amount; // 此时签名数量为0 transaction.signatureCount = 0; transactions[transactionId] = transaction; pendingTransactions.push(transactionId); // 交易创建事件 emit TransactionCreated(msg.sender, to, amount, transactionId); } // 获取pengding队列中的交易列表 function getPendingTransactions() public isManager view returns(uint[]){ return pendingTransactions; } // 签名(入参 交易ID) function signTransaction(uint transactionId) public isManager{ Transaction storage transaction = transactions[transactionId]; require(0x0 != transaction.from); require(msg.sender != transaction.from); require(transaction.signatures[msg.sender]!=1); transaction.signatures[msg.sender] = 1; transaction.signatureCount++; // 如果符合条件就放行 if(transaction.signatureCount >= MIN_SIGNATURES){ require(address(this).balance >= transaction.amount); // 放行 转账 执行交易 transaction.to.transfer(transaction.amount); // 触发转账成功事件 emit TransferFunds(transaction.to, transaction.amount); // 将此笔交易从pending队列中移除 deleteTransactions(transactionId); } } // 移除交易 function deleteTransactions(uint transacionId) public isManager{ uint8 replace = 0; for(uint i = 0; i< pendingTransactions.length; i++){ if(1==replace){ pendingTransactions[i-1] = pendingTransactions[i]; }else if(transacionId == pendingTransactions[i]){ replace = 1; } } delete pendingTransactions[pendingTransactions.length - 1]; pendingTransactions.length--; delete transactions[transacionId]; } function walletBalance() public isManager view returns(uint){ return address(this).balance; } }
0.5.10