Skip to content

safeSend Uses A Callback Innappropriately #194

@dysbulic

Description

@dysbulic

Description

In @didtools/pkh-ethereum, there is a safeSend function defined in the utils file which handles performing a call to an RPC endpoint for the Ethereum blockchain. This method uses a callback to retrieve the value from the send function, which doesn't take a callback, but instead returns a promise.

Technical Information

Part of the definition of safeSend is as follows:

 if (provider.sendAsync || provider.send) {
  const sendFunc = (provider.sendAsync ? provider.sendAsync : provider.send).bind(provider);
  const request = encodeRpcMessage(method, params);
  return new Promise((resolve, reject)=>{
      sendFunc(request, (error, response)=>{
          if (error) reject(error);
          if (response.error) {
              const error = new Error(response.error.message);
              error.code = response.error.code;
              error.data = response.error.data;
              reject(error);
          }
          resolve(response.result);
      });
  });
}

The problem is that the Legacy Provider API only defines a callback for sendAsync. Regular send returns a promise.

As expected ethers v6 send follows this format and a call to getAccountId or (more importantly) EthereumWebAuth.getAuthMethod will fail silently when the call is performed and the result is returned as a promise rather than in a callback.

Additionally

The part of safeSend that uses the request method looks like:

return provider.request({ method, params }).then(
      (response: any) => response,
      (error: any) => { throw error },
    )

According to the documentation, I'm pretty sure that should be:

return provider.request({ method, params })
  .then((response: any) => response)
  .catch((error: any) => { throw error })

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions