Author

Topic: solidity, плата за вызов функции (Read 258 times)

sr. member
Activity: 613
Merit: 256
Мысли вслух....

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

Пока такие ссылки нашел:
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.

До чего мы дожили кодерские темы модераторы в альты переносят, модераторы уже совсем не шарят в теме? ЛОЛ.
sr. member
Activity: 1337
Merit: 288
0xbt
Мысли вслух....

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

Пока такие ссылки нашел:
https://dicoiner.com/вызов-существующего-контракта-из-другого-контракта-f9a140eb7dc1  
https://askentire.net/q/Как-вызвать-функцию-из-уже-развернутого-контракта-32299853198  
https://ethereum.stackexchange.com/questions/9733/calling-function-from-deployed-contract
sr. member
Activity: 613
Merit: 256
Заменил
resp = payableService.summ(arg1, arg2);

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

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

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

За код который может пригодиться вам по мериту  Wink
Может есть смысл отдельную тему для полезного кода создать?
sr. member
Activity: 1337
Merit: 288
0xbt
Может пригодиться пример реализации у Etherdelta
https://etherscan.io/address/0x8d12a197cb00d4747a1fe03395095ce2a5cc6819#code
newbie
Activity: 13
Merit: 0
Посмотрите ссылку, может пригодится https://github.com/ethereum/EIPs/issues/865
jr. member
Activity: 46
Merit: 3
А как выводить эфир с адреса контракта, обязательно функцию писать для этого или владелец контракта как то имеет возможность совершать транзакции с этого контракта без написания специальной функции?

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

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

Я могу написать функцию которая будет выводить эфир с адреса моего смарт контракта, но хочу узнать есть ли возможность у того кто деплоил контракт выводить эфир с баланса смарт контракта?
sr. member
Activity: 1337
Merit: 288
0xbt
А как выводить эфир с адреса контракта, обязательно функцию писать для этого или владелец контракта как то имеет возможность совершать транзакции с этого контракта без написания специальной функции?

Вы знаете, пока не разбирался.
Подготовил концепцию нового токена, перерываю толк на поиск аналогов.
Одновременно просматриваю интересные контракты и возможность реализации.
Все, что интересует пока быстро просматриваю забрасываю в закладки, откуда и послал вам ссылки.
Уже массу закладок понаделал. Когда читать?
Кстати данная тема меня интересует. Так что спасибо, за то что не промолчали,
а ответили да еще и с кодом.
Возможно в будущем к вам и обращусь с вопросом.
jr. member
Activity: 46
Merit: 3
Заменил
resp = payableService.summ(arg1, arg2);

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

А как выводить эфир с адреса контракта, обязательно функцию писать для этого или владелец контракта как то имеет возможность совершать транзакции с этого контракта без написания специальной функции?
jr. member
Activity: 46
Merit: 3

Сделал как по ссылкам описано и это работает.
Такой код для проверки пришлось написать
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);
    }     
}
newbie
Activity: 14
Merit: 0
Вы можете переложить оплату газа на пользователя, но указать точную сумму не сможете
jr. member
Activity: 46
Merit: 3
Я хочу сделать так чтобы тот кто вызывает функцию в моем контракте заплатил бы мне за вызов фиксированную сумму, как это сделать? Как прописать сумму которую я хочу взымать за вызов функции?
Если я объявлю мою функцию как payable то что мне еще надо сделать?
Jump to: