Hardhat-deploy: ํ•˜๋“œ์›จ์–ด ์ง€๊ฐ‘ ์ง€์›?

์— ๋งŒ๋“  2021๋…„ 03์›” 26์ผ  ยท  20์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: wighawag/hardhat-deploy

์—ฌ๋ณด์„ธ์š”! ์šฐ๋ฆฌ๋Š” hardhat-deploy ๋ฅผ https://github.com/ethereum-optimism/contracts ์— ํ†ตํ•ฉํ•˜๊ธฐ๋ฅผ ํฌ๋งํ•ฉ๋‹ˆ๋‹ค hardhat-deploy ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ฐจ๋‹จ์€ ์•„๋‹ˆ์ง€๋งŒ ์žฅ๊ธฐ์ ์œผ๋กœ ํ™•์‹คํžˆ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ง€๊ธˆ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์ด๊ฒƒ์ด ๋‚™๊ด€์ฃผ์˜ ํŒ€์ด ๋„์šธ ์ˆ˜ ์žˆ๋Š” ์ผ์ž…๋‹ˆ๊นŒ?

enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@smartcontracts ๊ฐ€ ์ œ์•ˆํ•œ ์ดˆ๊ธฐ ์†”๋ฃจ์…˜์ด ๊ฐ€์žฅ ์šฐ์•„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

hardhat์— ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  20 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @smartcontracts์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ œ๊ฐ€ ๊ผญ ๊ฐ–๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

3๊ฐ€์ง€ ์˜ต์…˜์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ•œ ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์€ hardhat-deploy-ethers deployContract ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ethers ์„œ๋ช…์ž๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(hardhat-deploy ์ž์ฒด์—์„œ ์ด๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ์ด PR ์ฐธ์กฐ: https://github.com/wighawag/hardhat- ๋ฐฐํฌ/๋‹น๊ธฐ๊ธฐ/62). ๊ทธ๋Ÿฌ๋‚˜ hardhat-deploy ์‚ฌ์šฉ์ž๋กœ์„œ ์ด๊ฒƒ์€ ์„œ๋ช…์ž ๋“ฑ์„ ์ธ์Šคํ„ด์Šคํ™”ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์šฐ์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...

  2. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์•ˆ์ „๋ชจ ์ˆ˜์ค€์—์„œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๊ณ  ์•ˆ์ „๋ชจ ๊ณต๊ธ‰์ž๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž์Šต๋‹ˆ๋‹ค.
    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด hardhat-deploy๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ ์‚ฌ์šฉ ์‚ฌ๋ก€๋„ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด hardhat-deploy์˜ ์ผ๋ถ€๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”์ง€ ์•Œ์•„๋‚ด์•ผ๋งŒ ํ•œ๋‹ค.
    ํ˜„์žฌ hardhat-deploy๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ณ„์ • ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ๊ณ„์ •์€ ๋‹จ์ˆœํžˆ ๋ฌธ์ž์—ด๋กœ ๋œ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.
    from ํ•„๋“œ์— ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ํ•ด๋‹น ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    ์ด๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  from ํ•„๋“œ๋ฅผ ๋ฌธ์ž์—ด์ด๋‚˜ ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๊ฐ„๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด๋Š” ํ•˜๋“œ์›จ์–ด ์ง€๊ฐ‘์ธ์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์˜ต์…˜์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๊ทธ๋Ÿฌ๋‚˜ ์ด์ƒ์ ์œผ๋กœ๋Š” ๋ช…๋ช…๋œ ๊ณ„์ •์„ ํ†ตํ•ด ์ด๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ํ˜„์žฌ์˜ ๋ช…๋ช… ๊ณ„์ • ๊ตฌ์กฐ๋Š” ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋Š” ์ฃผ์†Œ ๋ฌธ์ž์—ด ์•ž์— " ledger://0x34fe4ff... "์™€ ๊ฐ™์€ ํ”„๋กœํ† ์ฝœ ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค

๋งค์šฐ ํฅ๋ฏธ๋กœ์šด. ๋‚˜์˜ ์ดˆ๊ธฐ ๋ฐ˜์‘์€ (์ด์ƒ์ ์œผ๋กœ) ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์„œ๋ช…์ž๊ฐ€ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๊ฐœ์ธ ํ‚ค์ธ์ง€ ์•„๋‹ˆ๋ฉด ํ•˜๋“œ์›จ์–ด ์ง€๊ฐ‘์ธ์ง€ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” hardhat ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ์˜ accounts ํ•„๋“œ์— ํ•˜๋“œ์›จ์–ด ์ง€๊ฐ‘ ์—ฐ๊ฒฐ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ„๋„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ LedgerSigner ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(

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

๋„ค, ๊ทธ๊ฒŒ ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€ํ•œ ๋‚ฎ์€ ์ˆ˜์ค€์œผ๋กœ

๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ํ•˜๋“œ์›จ์–ด ์ง€๊ฐ‘์ด ํ™•์ธ ์—†์ด ์ฃผ์†Œ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ณ„์ • ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ, ๋„๊ตฌ๊ฐ€ ์ง€๊ฐ‘์—์„œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์š”์ฒญํ•˜์ง€๋งŒ ์ด์ƒ์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ณ„์ • ๊ฐœ์ฒด๋Š” ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•˜๊ณ  ์‹ค์ œ๋กœ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋ญ”๊ฐ€

๋”ฐ๋ผ์„œ ๊ณ„์ • ๊ฐœ์ฒด๋Š” ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•˜๊ณ  ์‹ค์ œ๋กœ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋ญ”๊ฐ€

์ €๋Š” ์ด๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์ผ ์‹คํ—˜ํ•ด๋ณด๊ณ  ์ƒ๋Œ€์ ์œผ๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋„์›€์„ ์ฐพ๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ? ์ œ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์—์„œ ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ ๋‹น์žฅ์€ ์•„๋‹ˆ์ง€๋งŒ ๋ˆ„๋ฝ๋œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์„ ์œ„ํ•ด ์ด์™€ ๊ฐ™์ด ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

๋‚˜๋Š” ์ง€๊ธˆ ์ด๊ฒƒ์„ ์‹คํ—˜ํ•˜๊ณ  ์žˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ hardhat์˜ ๋‚ฎ์€ ์ˆ˜์ค€์—์„œ ์ด๊ฒƒ์„ ํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ๋งŽ์€ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์‰ฌ์šด ์ž„์‹œ ํ•ด๊ฒฐ์ฑ…์€ 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://github.com/wighawag/hardhat-deploy/pull/62
๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚˜๋Š” ethers ๋˜๋Š” API ์ธก์˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋…๋ฆฝ์ ์œผ๋กœ hardhat-deploy๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‚ด ๋‹ต์žฅ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด hardhat-deploy-ethers ํ†ตํ•ด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/wighawag/hardhat-deploy-ethers

์ด๋Ÿฐ ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‹œ๊ธ‰ํ•œ๊ฐ€์š”?

์•ˆ๋…•ํ•˜์„ธ์š” @smartcontracts ์ตœ์‹  ๋ฒ„์ „(0.7.0-beta.51)์— ์›์žฅ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์›์žฅ ์ง€์›์ด ๋ฒ„๊ทธ๊ฐ€ ๋งŽ์€ ๊ฒƒ ๊ฐ™์•„์„œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์ด์™€ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ: https://github.com/ethers-io/ethers.js/issues/1203). ํ•˜์ง€๋งŒ ์•„๋งˆ๋„ ๋‹น์‹ ์€ ๋‚˜๋ณด๋‹ค ๋” ๋‚˜์€ ๊ธฐํšŒ๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ถ”๊ฐ€ํ•˜๊ธฐ ๋งค์šฐ ์‰ฌ์šด ์˜ต์…˜ 3์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ๋ช…๋ช… ๋œ ๊ณ„์ •์„ ์ถ”๊ฐ€ ledger://<address> ์—ฌ๊ธฐ ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฐธ์กฐ : https://github.com/wighawag/template-ethereum-contracts/blob/d7eee3fc00b7e6a347a5ef2cd7718998254f2401/hardhat.config.ts#L15

hardhat-deploy๋Š” ์ด๋ฅผ ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ด ๋ช…๋ช…๋œ ๊ณ„์ •์„ ์—ฌ์ „ํžˆ ์ฃผ์†Œ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐฐํ›„์—์„œ๋Š” ํ•ด๋‹น ๊ณ„์ •์„ LedgerSigner์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด ์ง€๊ฐ‘์ด ๊ฐ์ง€๋˜๋ฉด ๋กœ๊ทธ๋„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค/.

hardhat์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋‚ฎ์€ ์ˆ˜์ค€์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋ฌด์Šจ ์ƒ๊ฐ์„ํ•˜๋Š”์ง€ ์ œ๊ฒŒ ์•Œ๋ ค์ฃผ์„ธ์š”

์ด๊ฑด ๋๋‚ด์ค˜. ์ง€๊ธˆ ํ…Œ์ŠคํŠธ ์ค‘์ž…๋‹ˆ๋‹ค!

ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์ง€๋งŒ ์ผ์ข…์˜ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ethers ์›์žฅ ํŒจํ‚ค์ง€๊ฐ€ ์•ฝ๊ฐ„ ์†์ƒ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@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์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@rokso ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค
ethers.js hardhware-wallet ํŒจํ‚ค์ง€์˜ ํ›„๊ธฐ ๋ฒ„์ „์€ ์–ด์จŒ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@wighawag ๋ช…์‹œ์ ์œผ๋กœ close ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋ฏ€๋กœ ethers.js๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ ์น ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ethers.js๋Š” close ๋ฉ”์†Œ๋“œ๋ฅผ ๋…ธ์ถœํ•˜์—ฌ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@rokso ๋Š” diff๋ฅผ๋ณด๊ณ  ๋ชจ๋“  ๋ฐฐํฌ ํ›„์— ๋‹ซ์Šต๋‹ˆ๋‹ค.
ethers.js๋Š” tx ์ˆ˜์ค€์—์„œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@wighawag ์˜ˆ, ์ž‘๋™ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•ด ์ƒˆ ์—ฐ๊ฒฐ์„ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์€ ์šฐ๋ฆฌ๊ฐ€ ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ์—ด ๋•Œ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์— ํšจ๊ณผ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@smartcontracts ๊ฐ€ ์ œ์•ˆํ•œ ์ดˆ๊ธฐ ์†”๋ฃจ์…˜์ด ๊ฐ€์žฅ ์šฐ์•„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

hardhat์— ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, ๊ทธ๋ƒฅ ์ด ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ๋˜์—ˆ๋‚˜์š”? ๊ตฌ์„ฑ์˜ namedAccounts ๋‚ด์—์„œ ' ledger://0x00000000000000addr00000 '์„(๋ฅผ) ์‚ฌ์šฉํ•˜๋Š” ์„ค์ •์„ ์‹œ๋„ํ•˜๋Š” ๋™์•ˆ ๋กœ์ปฌ์—์„œ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: /bindings.js:126 err = new Error( ^ Error: Could not locate the bindings file. Tried: .

ethers ํ•˜๋“œ์›จ์–ด ์ง€๊ฐ‘ ํŒจํ‚ค์ง€๊ฐ€ ์•„์ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. https://github.com/ethers-io/ethers.js/issues/1440#issuecomment -816554584

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰