Bitcoin Forum
November 19, 2024, 03:16:47 PM *
News: Latest Bitcoin Core release: 28.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: solidity, плата за вызов функции  (Read 257 times)
zan0za (OP)
Jr. Member
*
Offline Offline

Activity: 46
Merit: 3


View Profile
September 21, 2018, 01:12:06 PM
 #1

Я хочу сделать так чтобы тот кто вызывает функцию в моем контракте заплатил бы мне за вызов фиксированную сумму, как это сделать? Как прописать сумму которую я хочу взымать за вызов функции?
Если я объявлю мою функцию как payable то что мне еще надо сделать?
resttorg
Newbie
*
Offline Offline

Activity: 14
Merit: 0


View Profile
September 22, 2018, 12:15:08 PM
 #2

Вы можете переложить оплату газа на пользователя, но указать точную сумму не сможете
bomj
Sr. Member
****
Offline Offline

Activity: 1337
Merit: 288


0xbt


View Profile WWW
September 23, 2018, 09:31:10 AM
Last edit: September 23, 2018, 11:47:39 AM by bomj
 #3

https://ethereum.stackexchange.com/questions/6676/add-a-transaction-fee-for-each-time-a-function-is-called
https://ethereum.stackexchange.com/questions/42322/how-to-dynamically-charge-a-fee-associated-with-executing-a-particular-solidity
Еще интересные моменты -
https://ethereum.stackexchange.com/questions/11818/paying-a-transaction-fee-with-an-erc20-token
https://ethereum.stackexchange.com/questions/144/can-contracts-pay-the-gas-instead-of-the-message-sender/46546#46546
https://github.com/bitclave/Feeless
https://github.com/ethereum/EIPs/issues/865

zan0za (OP)
Jr. Member
*
Offline Offline

Activity: 46
Merit: 3


View Profile
September 24, 2018, 07:30:53 PM
 #4


Сделал как по ссылкам описано и это работает.
Такой код для проверки пришлось написать
Code:
//PayableService.sol

pragma solidity ^0.4.25;

contract PayableService{

    address public owner;
   
    address public donator;
   
    uint amount;
   
    uint public constant ETH_PERCENT = 10 * 10 ** 15;  // price in wei // 0.01 ETH
   
    uint public constant CALL_PRICE = ETH_PERCENT * 50; // 50% = 0.5 ETH
   
    uint public ret = 0;
   
    constructor() payable public {
        owner = msg.sender;
    }   
   
    function () payable public  {
        donator = msg.sender;
        amount = msg.value;
    }

    function summ(uint arg1, uint arg2) payable public /*constant*/ returns (uint) {
       
        require(msg.value >= CALL_PRICE);
       
        require(arg1 >= 0 && arg2 >= 0);
       
        return ret = arg1 + arg2;
    }

}

Если просто вызывать функцию и делать оплату то это работает.
А что делать если надо из смарт контракта вызвать платную функцию другого контракта, как мне переделать этот пример чтобы работал с контрактом выше?

Code:
//PayableServiceUser.sol

pragma solidity ^0.4.25;

import "./PayableService.sol";

contract PayableServiceUser {
   
    address public owner;
   
    address public addr1;
   
    uint public resp = 0;
   
    constructor() payable public {
        owner = msg.sender;
    }     

    function setContractAddr(address _addr) payable public{
        require(msg.sender == owner);
        addr1 = _addr;
    }   
   
    function requestService(uint arg1, uint arg2) payable public {
       
        //как тут вызов сделать который будет платить за вызов?
        PayableService payableService = PayableService(addr1);
        resp = payableService.summ(arg1, arg2);
    }     
}
zan0za (OP)
Jr. Member
*
Offline Offline

Activity: 46
Merit: 3


View Profile
September 24, 2018, 10:49:17 PM
Merited by bomj (1), Jaga-Jaga (1)
 #5

Заменил
resp = payableService.summ(arg1, arg2);

на
resp =  payableService.summ.value(CALL_PRICE)(arg1, arg2);
Так заработало.

А как выводить эфир с адреса контракта, обязательно функцию писать для этого или владелец контракта как то имеет возможность совершать транзакции с этого контракта без написания специальной функции?
bomj
Sr. Member
****
Offline Offline

Activity: 1337
Merit: 288


0xbt


View Profile WWW
September 25, 2018, 05:15:37 PM
 #6

А как выводить эфир с адреса контракта, обязательно функцию писать для этого или владелец контракта как то имеет возможность совершать транзакции с этого контракта без написания специальной функции?

Вы знаете, пока не разбирался.
Подготовил концепцию нового токена, перерываю толк на поиск аналогов.
Одновременно просматриваю интересные контракты и возможность реализации.
Все, что интересует пока быстро просматриваю забрасываю в закладки, откуда и послал вам ссылки.
Уже массу закладок понаделал. Когда читать?
Кстати данная тема меня интересует. Так что спасибо, за то что не промолчали,
а ответили да еще и с кодом.
Возможно в будущем к вам и обращусь с вопросом.

zan0za (OP)
Jr. Member
*
Offline Offline

Activity: 46
Merit: 3


View Profile
September 25, 2018, 10:06:52 PM
 #7

А как выводить эфир с адреса контракта, обязательно функцию писать для этого или владелец контракта как то имеет возможность совершать транзакции с этого контракта без написания специальной функции?

Вы знаете, пока не разбирался.
Подготовил концепцию нового токена, перерываю толк на поиск аналогов.
Одновременно просматриваю интересные контракты и возможность реализации.
Все, что интересует пока быстро просматриваю забрасываю в закладки, откуда и послал вам ссылки.
Уже массу закладок понаделал. Когда читать?
Кстати данная тема меня интересует. Так что спасибо, за то что не промолчали,
а ответили да еще и с кодом.
Возможно в будущем к вам и обращусь с вопросом.

Как можно без кода задавать вопрос или отвечать в теме КОДЕРЫ?  Grin

Я могу написать функцию которая будет выводить эфир с адреса моего смарт контракта, но хочу узнать есть ли возможность у того кто деплоил контракт выводить эфир с баланса смарт контракта?
pchistyakov
Newbie
*
Offline Offline

Activity: 13
Merit: 0


View Profile
September 26, 2018, 06:14:23 AM
 #8

Посмотрите ссылку, может пригодится https://github.com/ethereum/EIPs/issues/865
bomj
Sr. Member
****
Offline Offline

Activity: 1337
Merit: 288


0xbt


View Profile WWW
September 26, 2018, 10:14:10 AM
Merited by Jaga-Jaga (1)
 #9

Может пригодиться пример реализации у Etherdelta
https://etherscan.io/address/0x8d12a197cb00d4747a1fe03395095ce2a5cc6819#code

Jaga-Jaga
Sr. Member
****
Offline Offline

Activity: 613
Merit: 256



View Profile
October 01, 2018, 05:35:37 PM
 #10

Заменил
resp = payableService.summ(arg1, arg2);

на
resp =  payableService.summ.value(CALL_PRICE)(arg1, arg2);
Так заработало.

А как выводить эфир с адреса контракта, обязательно функцию писать для этого или владелец контракта как то имеет возможность совершать транзакции с этого контракта без написания специальной функции?

Может пригодиться пример реализации у Etherdelta
https://etherscan.io/address/0x8d12a197cb00d4747a1fe03395095ce2a5cc6819#code

За код который может пригодиться вам по мериту  Wink
Может есть смысл отдельную тему для полезного кода создать?

           ▀██▄ ▄██▀
            ▐█████▌
           ▄███▀███▄
         ▄████▄  ▀███▄
       ▄███▀ ▀██▄  ▀███▄
     ▄███▀  ▄█████▄  ▀███▄
   ▄███▀  ▄███▀ ▀███▄  ▀███▄
  ███▀  ▄████▌   ▐████▄  ▀███
 ███   ██▀  ██▄ ▄██  ▀██   ███
███   ███  ███   ███  ███   ███
███   ███   ███████   ███   ███
 ███   ███▄▄       ▄▄███   ███
  ███▄   ▀▀█████████▀▀   ▄███
   ▀████▄▄           ▄▄████▀
      ▀▀███████████████▀▀
DeepOnion
███
███
███
███
███
███
███
███
███
███
   Anonymity Guaranteed
   Anonymous and Untraceable
   Guard Your Privacy
      ▄▄██████████▄▄
    ▄███▀▀      ▀▀█▀   ▄▄
   ███▀              ▄███
  ███              ▄███▀   ▄▄
 ███▌  ▄▄▄▄      ▄███▀   ▄███
▐███  ██████   ▄███▀   ▄███▀
███▌ ███  ███▄███▀   ▄███▀
███▌ ███   ████▀   ▄███▀
███▌  ███   █▀   ▄███▀  ███
▐███   ███     ▄███▀   ███
 ███▌   ███  ▄███▀     ███
  ███    ██████▀      ███
   ███▄             ▄███
    ▀███▄▄       ▄▄███▀
      ▀▀███████████▀▀
bomj
Sr. Member
****
Offline Offline

Activity: 1337
Merit: 288


0xbt


View Profile WWW
October 10, 2018, 01:37:32 PM
 #11

Мысли вслух....

Условие:
Существует развернутый контракт А.
Задача:
Создать контракт Б, который будет срабатывать при вызове
Контракта А.

Пока такие ссылки нашел:
https://dicoiner.com/вызов-существующего-контракта-из-другого-контракта-f9a140eb7dc1  
https://askentire.net/q/Как-вызвать-функцию-из-уже-развернутого-контракта-32299853198  
https://ethereum.stackexchange.com/questions/9733/calling-function-from-deployed-contract

Jaga-Jaga
Sr. Member
****
Offline Offline

Activity: 613
Merit: 256



View Profile
October 14, 2018, 06:45:09 PM
 #12

Мысли вслух....

Условие:
Существует развернутый контракт А.
Задача:
Создать контракт Б, который будет срабатывать при вызове
Контракта А.

Пока такие ссылки нашел:
https://dicoiner.com/вызов-существующего-контракта-из-другого-контракта-f9a140eb7dc1  
https://askentire.net/q/Как-вызвать-функцию-из-уже-развернутого-контракта-32299853198  
https://ethereum.stackexchange.com/questions/9733/calling-function-from-deployed-contract

Если в контракте A не предусмотрен вызов другого контракта то никак не вызвать. Контракты нельзя изменять.
Если в контракте A заранее предусмотреть вызов контракта B то это несложно реализовать, можно даже запилить контракт так чтобы из него можно было вызывать любой контракт а не только B, но и C, D, E, F, при этом этих контрактов еще может и не существовать на момент деплоя контракта A.

До чего мы дожили кодерские темы модераторы в альты переносят, модераторы уже совсем не шарят в теме? ЛОЛ.

           ▀██▄ ▄██▀
            ▐█████▌
           ▄███▀███▄
         ▄████▄  ▀███▄
       ▄███▀ ▀██▄  ▀███▄
     ▄███▀  ▄█████▄  ▀███▄
   ▄███▀  ▄███▀ ▀███▄  ▀███▄
  ███▀  ▄████▌   ▐████▄  ▀███
 ███   ██▀  ██▄ ▄██  ▀██   ███
███   ███  ███   ███  ███   ███
███   ███   ███████   ███   ███
 ███   ███▄▄       ▄▄███   ███
  ███▄   ▀▀█████████▀▀   ▄███
   ▀████▄▄           ▄▄████▀
      ▀▀███████████████▀▀
DeepOnion
███
███
███
███
███
███
███
███
███
███
   Anonymity Guaranteed
   Anonymous and Untraceable
   Guard Your Privacy
      ▄▄██████████▄▄
    ▄███▀▀      ▀▀█▀   ▄▄
   ███▀              ▄███
  ███              ▄███▀   ▄▄
 ███▌  ▄▄▄▄      ▄███▀   ▄███
▐███  ██████   ▄███▀   ▄███▀
███▌ ███  ███▄███▀   ▄███▀
███▌ ███   ████▀   ▄███▀
███▌  ███   █▀   ▄███▀  ███
▐███   ███     ▄███▀   ███
 ███▌   ███  ▄███▀     ███
  ███    ██████▀      ███
   ███▄             ▄███
    ▀███▄▄       ▄▄███▀
      ▀▀███████████▀▀
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!