Skip to content
This repository was archived by the owner on Apr 22, 2024. It is now read-only.
This repository was archived by the owner on Apr 22, 2024. It is now read-only.

Unable to truffle migrate using a custom web3 provider engine #340

@mortimr

Description

@mortimr

Hi, I'm currently facing an issue while trying to deploy my contracts on a live network with truffle using a Ledger device.

Currently, I am able to connect to the device and properly sign and broadcast the first transaction, but it seems truffle is unable to resolve the transaction (while I can see the transaction confirmed).

I am 99% sure that the issue is coming from the web3 provider engine as I managed to deploy the contracts using the HDWallet provider, but I have no clue on what might be the difference in behavior.

This is the LedgerProvider I have:

const Web3 = require('web3');
const FiltersSubprovider = require('web3-provider-engine/subproviders/filters');
const NonceSubprovider = require('web3-provider-engine/subproviders/nonce-tracker');
const ProviderEngine = require('web3-provider-engine');
const ProviderSubprovider = require('web3-provider-engine/subproviders/provider');
const TransportU2F = require('@ledgerhq/hw-transport-node-hid').default;
const createLedgerSubprovider = require('@ledgerhq/web3-subprovider').default;
const {listen} = require('@ledgerhq/logs');

class LedgerProvider extends ProviderEngine {
    constructor(connector, options, url, headers, debug) {
        super();

        this.addProvider(new FiltersSubprovider());

        this.addProvider(new NonceSubprovider());

        this.addProvider(createLedgerSubprovider(async () => {
            const transport = await TransportU2F.create();

            listen(logs => console.log(logs.type, logs.message));

            return transport
        }, options));

        switch (connector) {
            case 'http': {
                const web3Provider = new Web3.providers.HttpProvider(url, {headers, keepAlive: false});
                web3Provider.sendAsync = (payload, callback) => {
                    console.log(payload.method);
                    return web3Provider.send(payload, callback);
                };
                this.addProvider(new ProviderSubprovider(web3Provider));
                break ;
            }
            case 'ws': {
                const web3Provider = new Web3.providers.WebsocketProvider(url, {headers});
                web3Provider.sendAsync = (payload, callback) => {
                    console.log(payload.method);
                    return web3Provider.send(payload, callback);
                };
                this.addProvider(new ProviderSubprovider(web3Provider));
                break ;
            }
        }
        this.start();
    }

}

And am using the following versions of the packages:

...
        "web3": "1.2.6",
        "web3-provider-engine": "15.0.7",
        "@ledgerhq/hw-transport-node-hid": "5.13.1",
        "@ledgerhq/web3-subprovider": "5.14.0",
        "@ledgerhq/logs": "5.13.1"
...

Truffle dispatches the transaction, and hangs for ever

     > transaction hash:    0x0db54853b3cce673aa71e87c48b8669eed006fe178dca3b736888bfdebad7a8d

  - Blocks: 0            Seconds: 0

I would like to know if someone else has such issues when using truffle + web3-provider-engine, or when trying to use a ledger device with truffle. Might not be the good place to ask this but honestly I cannot find people trying to do the same thing (I tried all ledger provider packages and have no results)

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