Как хранить ETH в смарт-контракте? - PullRequest
0 голосов
/ 03 ноября 2018

Я пишу смарт-контракт LibraryPortal, в котором несколько пользователей могут сдавать свои книги в аренду друг другу. Таким образом, в этом договоре msg.value содержит общую сумму, которая является комбинацией Гарантийного депозита и Арендной ставки.

Что мне нужно сделать, так это мгновенно перевести сумму Арендатора владельцу книги и сохранить оставшуюся сумму в договоре, т. Е. В Гарантийном депозите.

Если Арендатор не вернет книгу с указанным временем, сумма обеспечения будет передана Владельцу книги, в противном случае получит Арендатору.

Вот мой фрагмент:

function borrowBook(string _bName) payable returns (string){
    if(msg.sender != books[_bName].owner){
        if(books[_bName].available == true){
            if(getBalance()>=(books[_bName].amtSecurity + books[_bName].rate) ){
                books[_bName].borrower = msg.sender;
                books[_bName].available = false;
                books[_bName].owner.transfer(msg.value - books[_bName].amtSecurity);
                //  Code missing
                //  For storing
                //  ETH into the Contact
                return "Borrowed Succesful";
            }else{
                return "Insufficient Fund";
            }
        }else{
            return "Currently this Book is Not Available!";
        }
    }else{
        return "You cannot Borrow your own Book";
    }
}

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Спасибо, ребята, за ответы, но позже я узнал, что ЗНАЧЕНИЕ, отправленное вместе с транзакцией в контракт, хранится в самом Контракте, и вы можете получить к нему доступ, используя address(this).balance, который всегда дает вам Баланс, доступный в этом случае контракта. В связи с этим вам не нужны переменные или другие вещи для хранения ДРУГОГО в вашем контракте.

0 голосов
/ 03 ноября 2018

Вы можете получить результат от так называемого контракта условного депонирования.
Ниже приводится реализация контракта на условное депонирование open-zeppelin :

contract Escrow is Secondary {
  using SafeMath for uint256;

  event Deposited(address indexed payee, uint256 weiAmount);
  event Withdrawn(address indexed payee, uint256 weiAmount);

  mapping(address => uint256) private _deposits;

  function depositsOf(address payee) public view returns (uint256) {
    return _deposits[payee];
  }

  /**
  * @dev Stores the sent amount as credit to be withdrawn.
  * @param payee The destination address of the funds.
  */
  function deposit(address payee) public onlyPrimary payable {
    uint256 amount = msg.value;
    _deposits[payee] = _deposits[payee].add(amount);

    emit Deposited(payee, amount);
  }

  /**
  * @dev Withdraw accumulated balance for a payee.
  * @param payee The address whose funds will be withdrawn and transferred to.
  */
  function withdraw(address payee) public onlyPrimary {
    uint256 payment = _deposits[payee];

    _deposits[payee] = 0;

    payee.transfer(payment);

    emit Withdrawn(payee, payment);
  }
}

Вы можете просто создать экземпляр договора в своем договоре и перевести средства на него.

Для полной реализации аналогичных функций посмотрите подлежащий возврату краудсейл-контракт

...