0

Lets suppose here are user A and smartcontract B and C. A has no token but little ETH for gas, but B has enough tokens(Erc20).

  1. A send TX to B
  2. B send delegatecall to C
  3. C receive tokens in B and give ownership to A

Is this logic possible? If not, how can I make it? Pls correct me.

  • Why do you need contract C? Why doesn't contract B just transfer its tokens to user A? – smarx May 23 at 4:53
  • C is a kind of dapp. B need to send tokens to C directly to save time. – ikaop May 23 at 5:17
  • Then I don't understand the question. Maybe when you said "and give ownership to A" you're talking about ownership of something other than the tokens? – smarx May 23 at 5:21
  • I meant "C receive tokens in B and provide service to A" – ikaop May 23 at 5:23
  • In that case, of course this is possible. – smarx May 23 at 5:24
0

Here's some code doing this:

contract C {
    ERC20 token = ERC20(0x...);
    address ownerOfFoo;

    function buyFoo(address owner) external {
        require(ownerOfFoo == address(0), "already owned");
        require(token.transferFrom(msg.sender, address(this), 1000), "foo costs 1,000 token units");

        ownerOfFoo = owner;
    }
}

contract B {
    ERC20 token = ERC20(0x...);
    C c = C(0x...);

    function helpMeBuyFoo() external {
        // probably you want to allow only A to do this?
        // require(...);

        token.approve(c, 1000); // tokens will come from B
        c.buyFoo(msg.sender);   // tell C who should get the service
    }
}
  • Thanks! I will try! – ikaop May 23 at 7:03
  • I have question. If contract C(sort of dapp) check balance of msg.sender while executing function buyfoo, then it could be failed because there is no token in A's account. Isn't it? – ikaop May 23 at 10:20
  • If C checks the balance of msg.sender, it will be checking the balance of B. – smarx May 23 at 15:21
  • Is contract B using delegatecall or just call? I am still confused.. because if it's delegatecall, msg.sender must be A I think. – ikaop May 24 at 5:34
  • It's just a regular call. delegatecall wouldn't make sense here. – smarx May 24 at 13:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.