Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve API errors for tx that will revert (instead of UNPREDICTABLE_GAS_LIMIT) #186

Open
espendk opened this issue Feb 4, 2022 · 2 comments
Labels
enhancement New feature or request Priority 2 Priority 2 on a scale from 1 to 5.

Comments

@espendk
Copy link
Collaborator

espendk commented Feb 4, 2022

Context

If a transaction is going to revert for some reason one will typically get errors of the following kind:

await onchainLP.newAsk({volume:1000, price: 1.002})
Uncaught:
Error: cannot estimate gas; transaction may fail or may require manual gas limit (error={"reason":"cannot estimate gas; transaction may fail or may require manual gas limit","code":"UNPREDICTABLE_GAS_LIMIT","error": ...

Buried deep inside the error, the actual revert message is given, e.g. something like:

"execution reverted: MultiOwner/debitOnMgv/insufficient\"

Proposed solution

It would be great if the API could intercept these errors, determine the revert reason, and propagate a more telling error. This will be use useful both for developer but probably also for the UI.

A solution could be something along the following lines:

  • Define a set of Mangrove errors, in particular error codes for all revert reasons in Mangrove++ contracts
  • Create a wrapper that can be used around the sending of tx's inside of mangrove.js
    • we might want to expose the wrapper as well
  • The wrapper should contain a try-catch where the catch tries to decipher the error message and map it to something more telling
    • The mapping should be extensible as people might want to add/modify the error mappings
@jkrivine
Copy link
Collaborator

In the example below the information is buried here:

response: '{"jsonrpc":"2.0","id":151,"error":{"code":3,"message":"execution reverted: ERC20: transfer amount exceeds balance","data":"0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002645524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63650000000000000000000000000000000000000000000000000000"}}'
    },

complete log is:

<ref *1> Error: cannot estimate gas; transaction may fail or may require manual gas limit (error={"reason":"cannot estimate gas; transaction may fail or may require manual gas limit","code":"UNPREDICTABLE_GAS_LIMIT","error":{"code":3,"response":"{\"jsonrpc\":\"2.0\",\"id\":151,\"error\":{\"code\":3,\"message\":\"execution reverted: ERC20: transfer amount exceeds balance\",\"data\":\"0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002645524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63650000000000000000000000000000000000000000000000000000\"}}"},"method":"estimateGas","transaction":{"from":"0x5a6272e5d8690ad47Df72BBf7Fb08cE1851b8f54","maxPriorityFeePerGas":{"type":"BigNumber","hex":"0x9502f900"},"maxFeePerGas":{"type":"BigNumber","hex":"0x9502f910"},"to":"0x001B3B4d0F3714Ca98ba10F6042DaEbF0B1B7b6F","data":"0xa9059cbb00000000000000000000000095bdb8c6e0e15c75835d09e4d7694cfd8e184da100000000000000000000000000000000000000000000010f0cf064dd59200000","type":2,"accessList":null}}, tx={"data":"0xa9059cbb00000000000000000000000095bdb8c6e0e15c75835d09e4d7694cfd8e184da100000000000000000000000000000000000000000000010f0cf064dd59200000","to":{},"from":"0x5a6272e5d8690ad47Df72BBf7Fb08cE1851b8f54","type":2,"maxFeePerGas":{"type":"BigNumber","hex":"0x9502f910"},"maxPriorityFeePerGas":{"type":"BigNumber","hex":"0x9502f900"},"nonce":{},"gasLimit":{},"chainId":{}}, code=UNPREDICTABLE_GAS_LIMIT, version=abstract-signer/5.5.0)
    at Logger.makeError (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/@ethersproject/logger/src.ts/index.ts:225:28)
    at Logger.throwError (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/@ethersproject/logger/src.ts/index.ts:237:20)
    at /Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/@ethersproject/abstract-signer/src.ts/index.ts:301:31
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async Promise.all (index 7) {
  reason: 'cannot estimate gas; transaction may fail or may require manual gas limit',
  code: 'UNPREDICTABLE_GAS_LIMIT',
  error: Error: cannot estimate gas; transaction may fail or may require manual gas limit (error={"code":3,"response":"{\"jsonrpc\":\"2.0\",\"id\":151,\"error\":{\"code\":3,\"message\":\"execution reverted: ERC20: transfer amount exceeds balance\",\"data\":\"0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002645524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63650000000000000000000000000000000000000000000000000000\"}}"}, method="estimateGas", transaction={"from":"0x5a6272e5d8690ad47Df72BBf7Fb08cE1851b8f54","maxPriorityFeePerGas":{"type":"BigNumber","hex":"0x9502f900"},"maxFeePerGas":{"type":"BigNumber","hex":"0x9502f910"},"to":"0x001B3B4d0F3714Ca98ba10F6042DaEbF0B1B7b6F","data":"0xa9059cbb00000000000000000000000095bdb8c6e0e15c75835d09e4d7694cfd8e184da100000000000000000000000000000000000000000000010f0cf064dd59200000","type":2,"accessList":null}, code=UNPREDICTABLE_GAS_LIMIT, version=providers/5.5.0)
      at Logger.makeError (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/@ethersproject/logger/src.ts/index.ts:225:28)
      at Logger.throwError (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/@ethersproject/logger/src.ts/index.ts:237:20)
      at checkError (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/@ethersproject/providers/src.ts/json-rpc-provider.ts:80:16)
      at WebSocketProvider.<anonymous> (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/@ethersproject/providers/src.ts/json-rpc-provider.ts:562:20)
      at step (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/@ethersproject/providers/lib/json-rpc-provider.js:48:23)
      at Object.throw (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/@ethersproject/providers/lib/json-rpc-provider.js:29:53)
      at rejected (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/@ethersproject/providers/lib/json-rpc-provider.js:21:65)
      at processTicksAndRejections (node:internal/process/task_queues:96:5) {
    reason: 'cannot estimate gas; transaction may fail or may require manual gas limit',
    code: 'UNPREDICTABLE_GAS_LIMIT',
    error: Error: execution reverted: ERC20: transfer amount exceeds balance
        at WebSocketProvider._this._websocket.onmessage (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/@ethersproject/providers/src.ts/websocket-provider.ts:107:33)
        at WebSocket.onMessage (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/ws/lib/event-target.js:132:16)
        at WebSocket.emit (node:events:390:28)
        at Receiver.receiverOnMessage (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/ws/lib/websocket.js:834:20)
        at Receiver.emit (node:events:390:28)
        at Receiver.dataMessage (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/ws/lib/receiver.js:437:14)
        at Receiver.getData (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/ws/lib/receiver.js:367:17)
        at Receiver.startLoop (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/ws/lib/receiver.js:143:22)
        at Receiver._write (/Users/jkrivine/Documents/git/blockchain/mangrove/packages/mangrove-solidity/node_modules/ws/lib/receiver.js:78:10)
        at writeOrBuffer (node:internal/streams/writable:389:12) {
      code: 3,
      response: '{"jsonrpc":"2.0","id":151,"error":{"code":3,"message":"execution reverted: ERC20: transfer amount exceeds balance","data":"0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002645524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63650000000000000000000000000000000000000000000000000000"}}'
    },
    method: 'estimateGas',
    transaction: {
      from: '0x5a6272e5d8690ad47Df72BBf7Fb08cE1851b8f54',
      maxPriorityFeePerGas: [BigNumber],
      maxFeePerGas: [BigNumber],
      to: '0x001B3B4d0F3714Ca98ba10F6042DaEbF0B1B7b6F',
      data: '0xa9059cbb00000000000000000000000095bdb8c6e0e15c75835d09e4d7694cfd8e184da100000000000000000000000000000000000000000000010f0cf064dd59200000',
      type: 2,
      accessList: null
    }
  },
  tx: {
    data: '0xa9059cbb00000000000000000000000095bdb8c6e0e15c75835d09e4d7694cfd8e184da100000000000000000000000000000000000000000000010f0cf064dd59200000',
    to: Promise { '0x001B3B4d0F3714Ca98ba10F6042DaEbF0B1B7b6F' },
    from: '0x5a6272e5d8690ad47Df72BBf7Fb08cE1851b8f54',
    type: 2,
    maxFeePerGas: BigNumber { _hex: '0x9502f910', _isBigNumber: true },
    maxPriorityFeePerGas: BigNumber { _hex: '0x9502f900', _isBigNumber: true },
    nonce: Promise { 716 },
    gasLimit: Promise { <rejected> [Circular *1] },
    chainId: Promise { 80001 }
  }
}

@peterMangrove
Copy link
Contributor

This is still relevant!

@peterMangrove peterMangrove added the Priority 2 Priority 2 on a scale from 1 to 5. label Feb 7, 2023
@sync-by-unito sync-by-unito bot closed this as completed Jun 19, 2023
@espendk espendk reopened this Jun 19, 2023
Louis-Amas pushed a commit that referenced this issue Sep 15, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request Priority 2 Priority 2 on a scale from 1 to 5.
Projects
None yet
Development

No branches or pull requests

3 participants