ExampleofPurchaseContract
跳到导航
跳到搜索
Purchase contract
| Purchase contract, transfers the ownership of goods from a seller to a buyer through logistics company. There are 10 terms in the contract, including three parts: 1) once the goods are confirmed, the seller will sign a contract and take twice the contracting price as the delivery price, 2) the goods are sent to the buyer through logistics when the buyer purchases the goods, and 3) only when the logistics successfully delivers the goods to the buyer can the seller get back the payment. According to relevant laws, the contract requires the buyer can apply for compensation if goods do not arrive within 10 days after payment, or the seller can automatically confirm the arrival if the buyer does not confirm or apply for refund within 7 days after arrival.
// purchase.scs
} /* buyerT.sol */
pragma solidity ^0.4.22;
contract buyerT{
//attributes of actionconfirmPurchase
bool _isconfirmPurchaseDone;
uint _confirmPurchaseTime;
//attributes of actionconfirmReceived
bool _isconfirmReceivedDone;
uint _confirmReceivedTime;
//attributes of actionovertimeClaim
bool _isovertimeClaimDone;
uint _overtimeClaimTime;
//attributes of actionclaim
bool _isclaimDone;
uint _claimTime;
//attributes of actionrevokeClaim
bool _isrevokeClaimDone;
uint _revokeClaimTime;
uint _max;
bool _isbuyerDone;
uint _i = 0;
address[] _buyerAddress;
function buyerT(){
_max = now*1000;
}
function regist(address a) public {
_buyerAddress[_i] = a;
_i++;
}
function getAddress() public returns (address a){
return _buyerAddress[_i];
}
function confirmPurchaseDone(address a){
_confirmPurchaseTime = now;
_isbuyerDone = true;
}
function confirmPurchaseTime() returns (uint result){
if(_isconfirmPurchaseDone){
return _confirmPurchaseTime;
}
return _max;
}
function confirmReceivedDone(address a){
_confirmReceivedTime = now;
_isbuyerDone = true;
}
function confirmReceivedTime() returns (uint result){
if(_isconfirmReceivedDone){
return _confirmReceivedTime;
}
return _max;
}
function overtimeClaimDone(address a){
_overtimeClaimTime = now;
_isbuyerDone = true;
}
function overtimeClaimTime() returns (uint result){
if(_isovertimeClaimDone){
return _overtimeClaimTime;
}
return _max;
}
function claimDone(address a){
_claimTime = now;
_isbuyerDone = true;
}
function claimTime() returns (uint result){
if(_isclaimDone){
return _claimTime;
}
return _max;
}
function revokeClaimDone(address a){
_revokeClaimTime = now;
_isbuyerDone = true;
}
function revokeClaimTime() returns (uint result){
if(_isrevokeClaimDone){
return _revokeClaimTime;
}
return _max;
}
function contains(address a) returns (bool result) {
for (uint _j = 0; _j < _buyerAddress.length; _j++ ) { //for loop example
if (a == _buyerAddress[_j]){
return true;
}
}
return false;
}
}/* logisticsT.sol */
pragma solidity ^0.4.22;
contract logisticsT{
//attributes of actionarrive
bool _isarriveDone;
uint _arriveTime;
uint _max;
bool _islogisticsDone;
uint _i = 0;
address[] _logisticsAddress;
function logisticsT(){
_max = now*1000;
}
function regist(address a) public {
_logisticsAddress[_i] = a;
}
function getAddress() public returns (address a){
return _logisticsAddress[_i];
}
function arriveDone(address a){
_arriveTime = now;
_islogisticsDone = true;
}
function arriveTime() returns (uint result){
if(_isarriveDone){
return _arriveTime;
}
return _max;
}
function contains(address a) returns (bool result) {
for (uint _j = 0; _j < _logisticsAddress.length; _j++ ) { //for loop example
if (a == _logisticsAddress[_j]){
return true;
}
}
return false;
}
}/* Purchase.sol */
pragma solidity ^0.4.0;
import "./sellerT.sol";
import "./buyerT.sol";
import "./logisticsT.sol";
contract Purchase {
sellerT seller;
buyerT buyer;
logisticsT logistics;
uint balance;
goods xxxDescription;
uint start;
struct goods{
bytes32 name;
uint quantity;
uint price;
bytes32 package;
}
function Purchase(){
start = now;
seller = new sellerT();
buyer = new buyerT();
logistics = new logisticsT();
}
modifier onlyseller{
require(seller.contains(msg.sender));
_;
}
modifier onlybuyer{
require(buyer.contains(msg.sender));
_;
}
modifier onlylogistics{
require(logistics.contains(msg.sender));
_;
}
modifier no2Modifier{
require(now > seller.createTime());
require(xxxDescription.price * 2 > 0);
_;
}
modifier no3Modifier{
require(now < buyer.confirmPurchaseTime());
_;
}
modifier no4Modifier{
require((now > buyer.confirmPurchaseTime()) &&(now < buyer.confirmPurchaseTime()+864000));
_;
}
modifier no5Modifier{
require((now > logistics.arriveTime()) &&(now < logistics.arriveTime()+604800));
_;
}
modifier no6Modifier{
require((now > logistics.arriveTime()) &&(now < logistics.arriveTime()+604800));
_;
}
modifier no7Modifier{
require(now > start + 864000 || now > logistics.arriveTime());
_;
}
modifier no8Modifier{
require(now > buyer.claimTime() || now > buyer.overtimeClaimTime());
_;
}
modifier no9Modifier{
require(now > buyer.claimTime() || now > buyer.overtimeClaimTime());
_;
}
modifier no10Modifier{
require(now < buyer.claimTime() && now > logistics.arriveTime()+604800);
_;
}
function create() onlyseller() public payable {
//USER CODE HERE
//CHECK
}
function confirmPurchase() onlybuyer() no2Modifier() public payable {
//USER CODE HERE
//CHECK
}
function abort() onlyseller() no3Modifier() public payable {
//USER CODE HERE
msg.sender.transfer(xxxDescription.price * 2);
//CHECK
}
function arrive() onlylogistics() no4Modifier() public {
//USER CODE HERE
//CHECK
}
function confirmReceived() onlybuyer() no5Modifier() public payable {
//USER CODE HERE
msg.sender.transfer(xxxDescription.price);
address(seller).transfer(balance);
//CHECK
}
function claim() onlybuyer() no6Modifier() public {
//USER CODE HERE
//CHECK
}
function overtimeClaim() onlybuyer() no7Modifier() public {
//USER CODE HERE
//CHECK
}
function confirmClaim() onlyseller() no8Modifier() public payable {
//USER CODE HERE
address(buyer).transfer(balance);
//CHECK
}
function revokeClaim() onlybuyer() no9Modifier() public payable {
//USER CODE HERE
msg.sender.transfer(xxxDescription.price);
address(seller).transfer(balance);
//CHECK
}
function autoConfirm() onlyseller() no10Modifier() public payable {
//USER CODE HERE
msg.sender.transfer(xxxDescription.price);
address(seller).transfer(balance);
//CHECK
}
}/* sellerT.sol */
pragma solidity ^0.4.22;
contract sellerT{
//attributes of actioncreate
bool _iscreateDone;
uint _createTime;
//attributes of actionabort
bool _isabortDone;
uint _abortTime;
//attributes of actionconfirmClaim
bool _isconfirmClaimDone;
uint _confirmClaimTime;
//attributes of actionautoConfirm
bool _isautoConfirmDone;
uint _autoConfirmTime;
uint _max;
bool _issellerDone;
uint _i = 0;
address[] _sellerAddress;
function sellerT(){
_max = now*1000;
}
function regist(address a) public {
_sellerAddress[_i] = a;
_i++;
}
function getAddress() public returns (address a){
return _sellerAddress[_i];
}
function createDone(address a){
_createTime = now;
_issellerDone = true;
}
function createTime() returns (uint result){
if(_iscreateDone){
return _createTime;
}
return _max;
}
function abortDone(address a){
_abortTime = now;
_issellerDone = true;
}
function abortTime() returns (uint result){
if(_isabortDone){
return _abortTime;
}
return _max;
}
function confirmClaimDone(address a){
_confirmClaimTime = now;
_issellerDone = true;
}
function confirmClaimTime() returns (uint result){
if(_isconfirmClaimDone){
return _confirmClaimTime;
}
return _max;
}
function autoConfirmDone(address a){
_autoConfirmTime = now;
_issellerDone = true;
}
function autoConfirmTime() returns (uint result){
if(_isautoConfirmDone){
return _autoConfirmTime;
}
return _max;
}
function contains(address a) returns (bool result) {
for (uint _j = 0; _j < _sellerAddress.length; _j++ ) { //for loop example
if (a == _sellerAddress[_j]){
return true;
}
}
return false;
}
} |