Hardhat-deploy: 支持硬件钱包吗?

创建于 2021-03-26  ·  20评论  ·  资料来源: wighawag/hardhat-deploy

你好! 我们希望将hardhat-deploy集成到https://github.com/ethereum-optimism/contracts 中。 理想情况下,我们希望支持从硬件钱包进行部署。 它不是使用hardhat-deploy的障碍,但从长远来看它肯定会有所帮助。 现在这可能吗? 如果没有,Optimism 团队是否可以提供帮助?

enhancement

最有用的评论

我认为@smartcontracts提出的初始解决方案是最优雅的:

const config = {
  networks: {
    goerli: {
      accounts: [
        {
          platform: "ledger",
          type: "hid",
          path: "m/44'/60'/0'/0/0"
        }
      ],
    }
  }
}

安全帽上有未解决的问题吗? 我很乐意看看实施这个

所有20条评论

@smartcontracts这绝对是我想拥有的功能。

我可以看到 3 个选项:

  1. 一种可能性是向hardhat-deploy-ethers添加一个 deployContract 方法,它可以让您传递一个以太

  2. 我希望这可以在安全帽级别完成,并且很可能通过覆盖安全帽提供程序来实现。
    通过这种方式,不仅安全帽部署可以受益,而且所有其他插件和用例都可以受益。

  3. 否则,将其作为安全帽部署的一部分是可行的。 我只需要弄清楚这将如何配置。
    目前,hardhat-deploy 允许您命名帐户,而这些帐户只是作为字符串的地址。
    您在from字段中按原样传递该字符串。
    考虑到这一点,也许最简单的方法是将from字段更改为字符串或对象。 并且对象可以指定选项是否为硬件钱包。
    但理想情况下,我希望这可以通过命名帐户进行配置。 不幸的是,当前的命名帐户结构并不容易。 一个想法是在地址字符串前面加上一些协议字符串,比如“ ledger://0x34fe4ff...

很有意思。 我最初的反应是(理想情况下)插件不必关心签名者是明文私钥还是硬件钱包。 也许我们可以创建一个单独的插件,允许在安全帽网络配置的accounts字段中指定硬件钱包连接。 然后我们可以将其转换为LedgerSigner (似乎还没有

const config = {
  networks: {
    goerli: {
      accounts: [
        {
          platform: "ledger",
          type: "hid",
          path: "m/44'/60'/0'/0/0"
        }
      ],
    }
  }
}

是的,那是我认为最好的方式。 尽可能将其设为最低级别

我可以看到的一个问题是硬件钱包在未经确认的情况下不会公开地址,因此每个插件,获取帐户列表的工具都会要求用户在钱包上输入,这并不理想。

所以也许帐户对象应该指定地址,如果它实际上不匹配,那么它会出错,或者其他什么

所以也许帐户对象应该指定地址,如果它实际上不匹配,那么它会出错,或者其他什么

我认为这是正确的做法。 明天我将对此进行试验,看看我是否能让它变得相对可靠。

您是否正在寻求有关任何其他问题的帮助? 很乐意在我力所能及的地方提供帮助

不是现在,但很想知道缺少的功能,我可以像这样讨论它以获得最佳前进方式:)

我现在正在试验这个。 不幸的是,在安全帽的较低级别上执行此操作需要做很多工作。 一个简单的临时解决方案是hardhat-deploy允许将签名者传递给deploy而不仅仅是地址。 你对这件事有什么感想? 它将允许我们按照以下方式做一些事情:

const signer = new LedgerSigner(hre.network.provider, 'default', hre.ethers.utils.defaultPath)
const result = await deploy('MyContract', {
  from: signer,
  args: [],
  log: true,
})

@smartcontracts ,在这里查看我的答案: https :
基本上,我想让安全帽部署独立于 API 端的以太坊或任何其他库。

但正如我在那里的回复中提到的,这可以通过hardhat-deploy-ethershttps :

你有多迫切需要这样的东西?

@smartcontracts我在最新版本 (0.7.0-beta.51) 上添加了对

无法进行太多测试,因为分类帐支持似乎有很多问题(可能与此有关:https://github.com/ethers-io/ethers.js/issues/1203)。 但也许你会有比我更好的机会。

我使用了很容易添加的选项 3。 您基本上添加了一个具有ledger://<address>值的命名帐户,例如参见此处: https :

hardhat-deploy 将其转换为地址,因此您仍然可以将此命名帐户称为地址,但在幕后,它将该帐户与 LedgerSigner 相关联。 当检测到硬件钱包时,我还添加了日志/。

在安全帽的插件可以在低级别处理它之前,这对于大多数用例来说应该已经足够了。 让我知道你的想法

这是太棒了。 立即测试!

似乎适用于一笔交易,但随后出现了某种崩溃。 似乎以太分类帐包有点坏了。

@wighawag

diff --git a/node_modules/hardhat-deploy/dist/src/helpers.js b/node_modules/hardhat-deploy/dist/src/helpers.js
index 3b588fa..67dce8f 100644
--- a/node_modules/hardhat-deploy/dist/src/helpers.js
+++ b/node_modules/hardhat-deploy/dist/src/helpers.js
@@ -290,6 +290,10 @@ function addHelpers(deploymentManager, partialExtension, network, getArtifact, s
         if (options.log || hardwareWallet) {
             print(`: deployed at ${deployment.address} with ${receipt === null || receipt === void 0 ? void 0 : receipt.gasUsed} gas\n`);
         }
+        if(hardwareWallet){
+            const __eth = await ethersSigner._eth
+            await __eth.transport.device.close()
+        }
         return Object.assign(Object.assign({}, deployment), { address, newlyDeployed: true });
     }
     async function deterministic(name, options) {
@@ -396,7 +400,7 @@ function addHelpers(deploymentManager, partialExtension, network, getArtifact, s
                 transaction = await provider.getTransaction(deployment.transactionHash);
             }
             if (transaction) {
-                const { ethersSigner } = await getOptionalFrom(options.from);
+                const { ethersSigner, hardwareWallet } = await getOptionalFrom(options.from);
                 const { artifact } = await getArtifactFromOptions(name, options);
                 const abi = artifact.abi;
                 const byteCode = linkLibraries(artifact, options.libraries);
@@ -421,9 +425,17 @@ function addHelpers(deploymentManager, partialExtension, network, getArtifact, s
                             ' not specified in new transaction, cant compare');
                     }
                     if (transaction[field] !== newTransaction[field]) {
+                        if(hardwareWallet){
+                            const __eth = await ethersSigner._eth
+                            await __eth.transport.device.close()
+                        }
                         return { differences: true, address: deployment.address };
                     }
                 }
+                if(hardwareWallet){
+                    const __eth = await ethersSigner._eth
+                    await __eth.transport.device.close()
+                }
                 return { differences: false, address: deployment.address };
             }
         }

@wighawag如果你能指出我正确的方向以正确的方式进行修复,我可以发送 PR,我的修复不会在 PR 中进行;P

谢谢@rokso我去看看。
请注意,后一个版本的 ethers.js 硬件钱包包可能会解决该问题。

@wighawag不确定 ethers.js 将如何解决这个问题,因为我们必须明确调用close 。 ethers.js 可以通过暴露close方法来提供帮助

@rokso查看差异,您在每次部署后关闭。
ethers.js 可以在 tx 级别做同样的事情

@wigawag是的,可以,但用户将为每笔交易打开新连接。 当我们打开新连接时,此解决方案将适用于我们的案例。

我认为@smartcontracts提出的初始解决方案是最优雅的:

const config = {
  networks: {
    goerli: {
      accounts: [
        {
          platform: "ledger",
          type: "hid",
          path: "m/44'/60'/0'/0/0"
        }
      ],
    }
  }
}

安全帽上有未解决的问题吗? 我很乐意看看实施这个

大家好,只是想检查一下这个状态。 这已经解决了吗? 我在本地遇到此错误: /bindings.js:126 err = new Error( ^ Error: Could not locate the bindings file. Tried:尝试在配置的namedAccounts中使用“ ledger://0x000000000000000addr00000 ”的设置。

我认为 ethers 硬件钱包包还没有解决它的问题: https :

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

jaypaik picture jaypaik  ·  13评论

jsidorenko picture jsidorenko  ·  3评论

lcswillems picture lcswillems  ·  14评论

tennox picture tennox  ·  4评论

freebyte picture freebyte  ·  9评论