I am using the gnosis-safe core SDK here to create transactions to transfer Eth out of a deployed safe proxy. Doc: https://github.com/safe-global/safe-core-sdk/tree/main/packages/safe-core-sdk#deploysafe

I deployed the proxy on Rinkeby via:

        const { ethereum } = window;
        const provider = new ethers.providers.Web3Provider(ethereum)
        const safeOwner = provider.getSigner(0)
        const ethAdapter = new EthersAdapter({ ethers, signer: safeOwner });

        const txServiceUrl = 'https://safe-transaction.gnosis.io';
        const safeService = new SafeServiceClient({ txServiceUrl, ethAdapter });
        const is_dev = true;
        let ethAdapter = this.ethAdapter;
        const safeFactory = await SafeFactory.create({ ethAdapter, isL1SafeMasterCopy: !is_dev });

        const safeAccountConfig = {
          owners: ['0x...D9'],
          threshold: 1,

        const safeSdk = await safeFactory.deploySafe({ safeAccountConfig });        

So it is a safe with just one authorizer. I then deposit some ETH into this safe proxy, and try to send it out of the safe with:

        let safeAddress = '0x...c';
        const safeSdk = await Safe.create({ ethAdapter, safeAddress, isL1SafeMasterCopy: false })
        const num_ethers = ethers.utils.parseUnits("0.1", 'ether').toHexString();
        const transaction = {
          to: '0x...1', 
          data: '0x',
        const safeTransaction = await safeSdk.createTransaction(transaction)        
        console.log('safeTransaction: ', safeTransaction)
        const hash = await safeSdk.getTransactionHash(safeTransaction);
        const txResponse = await safeSdk.approveTransactionHash(hash);
        const reshash = await txResponse.transactionResponse?.wait();       

What ends up happening is that the authorizer is charged for the ApproveHash transaction, but the Eth does not transfer. Is there something I'm missing here conceptually? The data field should be 0x for transferring eth on Rinkeby network as well right? Tx log here: https://rinkeby.etherscan.io/address/0x99Ae62C23728EAa970F5064DcD3F869ae80FC89c

1 Answer 1


approveTransactionHash only approves the transaction without executing it. Please refer to the core SDK documentation to learn how to execute a transaction https://github.com/safe-global/safe-core-sdk/blob/main/packages/guides/integrating-the-safe-core-sdk.md#8-execute-the-transaction

  • Ok following that documentation, but I'm getting stuck at step 5. Propose the transaction to the service : I am getting error: POST https://safe-transaction.rinkeby.gnosis.io/api/v1/safes/0x07fa8876c390066B80B8735D98210822dBF32f5C/multisig-transactions/ 422 (Unprocessable Entity) sendRequest @ httpRequests.ts:16 proposeTransaction @ SafeServiceClient.ts:392 await in proposeTransaction (async) GnosisAPI.propose_tx @ gnosis_api.js:364 httpRequests.ts:52 Uncaught (in promise) Error: Unprocessable Entity It seems like the API is not POSTING with correct params
    – chibro2
    Jul 6, 2022 at 15:50
  • ^-- note in this case I deployed a safe proxy with two keys and threshold=2, so I need to propose a transaction with await safeService.proposeTransaction({...}) so the 2nd signer can retrieve the tx, and sign it.
    – chibro2
    Jul 6, 2022 at 15:52
  • i resolved this question, and posted a follow up question here: ethereum.stackexchange.com/questions/131297/…
    – chibro2
    Jul 6, 2022 at 16:24

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.