1

Hello guys i am trying to build a contract that act with eosio.token to make a transfer from my contract using inline action with the eosio.token contract here my code

#include <eosio/eosio.hpp>
#include <eosio.token/eosio.token.hpp>

using namespace std;
using namespace eosio;

class [[eosio::contract("test")]] test:public eosio::contract{
    private:
        void make_transfer(name& from,name& to,asset& quantity,string& memo)
        {
            token::transfer_action transfer{"eosio.token"_n, {from, "active"_n}};
            transfer.send(from,to,quantity, memo);
        }

    public:
        test(name receiver,name code,datastream <const char*> ds):contract(receiver,code,ds){}
        [[eosio::action]]
        void trade(name from,name to ,asset fromcoin,asset tocoin,string memo)
        {
            make_transfer(from,to,fromcoin,memo);
        }

};

i got these error

Error 3090003: Provided keys, permissions, and delays do not satisfy declared authorizations
Ensure that you have the related private keys inside your wallet and your wallet is unlocked.

    Error Details:
    transaction declares authority '{"actor":"alice","permission":"active"}', but does not have signatures for it under a provided delay of 0 ms, provided permissions [{"actor":"test","permission":"eosio.code"}], provided keys [], and a delay max limit of 3888000000 ms
    pending console output: 
1

2 Answers 2

0

You can't do this like what eosio.system does. eosio.system is usually deployed on eosio, privileged account, that can send any action with any permission.

Any inline actions your contract send is executed with permission [email protected]. If you want to make USER's token to be transferred by your contract, USER need to add [email protected] to USER@active. (but it means your contract can send any action with user's active permission)

In this case, it is better to make a notification handler than make your action transfer user's token.

[[eosio::on_notify(eosio.token::transfer)]]
void on_token_transfer(name from, name to, asset quantity, string memo) {
  do_something_what_you_want_to_do_when_receiving_token();
}
3
  • it worked when i added the permission to user but in your code the transfer go first and it will run the action after it but if i want to add some code to my transfer action should i make the changes to the eosio.token code? Commented Feb 16, 2020 at 15:44
  • No, I might confuse you with my answer. I showed you two ways. [1] Change permission (add eosio.code to user's active permission) [2] Use notification handler (this will make user send transfer to eosio.token, and your contract will handle by being notified from eosio.token). eosio.token already has notification logic.
    – conr2d
    Commented Feb 17, 2020 at 3:05
  • oh thanks,now it's clear thank you Commented Feb 17, 2020 at 4:39
0

I ran into the exact same issue. You have to add your smart contract to the active permission. Check out this answer, it will solve your problem:

https://eosio.stackexchange.com/a/1718/1010

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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