0

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: 
New contributor
AhmadKajjan is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.
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 YOUR_CONTRACT@eosio.code. If you want to make USER's token to be transferred by your contract, USER need to add YOUR_CONTRACT@eosio.code 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();
}
  • 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? – AhmadKajjan 9 hours ago

Your Answer

AhmadKajjan is a new contributor. Be nice, and check out our Code of Conduct.

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.