Hardhat-deploy: рдЙрдиреНрдирдпрди рдпреЛрдЧреНрдп рдЕрдиреБрдмрдВрдзреЛрдВ рдХреА рддреИрдирд╛рддреА рдкрд░ рдкреНрд░рд╢реНрди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдЬреВрди 2021  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: wighawag/hardhat-deploy

OpenZeppelin рдЙрдиреНрдирдпрди рдпреЛрдЧреНрдп рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?
OpenZeppelin upgrdable рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ () рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рд╛рд░реНрдбрд╣реИрдЯ рдЕрдкрдЧреНрд░реЗрдб рдкреНрд▓рдЧрдЗрди рджреНрд╡рд╛рд░рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рд╛рд░реНрдбрд╣реИрдЯ-рддреИрдирд╛рддреА рд╕реЗ рдХреЛрдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреЙрд▓ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдкреЛрд╕реНрдЯ-рдЕрдкрдЧреНрд░реЗрдб рд╡рд┐рдзрд┐ рдЬрд┐рд╕реЗ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдореБрдЭреЗ рдкрд╣рд▓реЗ рддреИрдирд╛рддреА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░ рддреИрдирд╛рддреА рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдмрд╛рд╣рд░ рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╛ рддреИрдирд╛рддреА рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рд╣реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд▓рд┐рдП рдкреБрди: рдкреНрд░рд╛рд░рдВрдн рдХрд╛рд░реНрдп

рдореИрдВрдиреЗ рд╣рд╛рд░реНрдбрд╣реИрдЯ-рддреИрдирд╛рддреА 0.8.0 рдореЗрдВ рдПрдХ рдирдпрд╛ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рд╛ ( methodName рдХреЗ рдмрдЬрд╛рдп рдЬреЛ рдЕрднреА рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ)

рджреЗрдЦреЗрдВ https://github.com/wighawag/template-ethereum-contracts/blob/595c1b5ec9cdf1276f4d3a43b4825bcef78bd2cd/deploy/004_deploy_erc20_always_proxied_via_openzeppelin_proxy.ts#L12 -L26

рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдЖрддреА рд╣реИ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ

рд╕рднреА 9 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рд╛рд░реНрдбрд╣реИрдЯ-рддреИрдирд╛рддреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдмреЗрдХрд╛рд░ рд╣реИрдВред рдкреНрд░реЙрдХреНрд╕реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкрд░ рднреА рдпрд╣реА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдХрд╛рд╕/рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕ рд░рд╛рдЬреНрдп рдореЗрдВ рдмрдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╣рд╛рд░реНрдбрд╣реИрдЯ-рддреИрдирд╛рддреА рдЙрд╕ рд░рд╛рдЬреНрдп рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХрд░ рджреЗрдЧреА,

рддреЛ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЕрдкрдиреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдп рдХреЛ рдмреЗрдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рд╛рд░рдВрдн рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреЛрд╕реНрдЯ рдЕрдкрдЧреНрд░реЗрдб рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рд╕рднреА рдареАрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдореИрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдлрдВрдХреНрд╢рди рдХреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдБ рдЬрдм рдореИрдВ рдЬрд╝рд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рддрд╛ рд╣реВрдБред

рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдЧреНрд░реЗрдб рдХреЛ рдЕрд▓рдЧ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЕрдзреАрди рд╣реИ: upgradeIndex рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рдЖрдкрдХреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЕрдкрдЧреНрд░реЗрдб рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рдмреАрдЪ рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдкрд░ рдпреЛрд░реВ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдкрдХреЗ рддреНрд╡рд░рд┐рдд рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдм рдХрд╛рдо рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдореИрдВ deploy() рдФрд░ рдлрд┐рд░ execute рдХреЗ рд╕рд╛рде OpenZeppelin Initializable рдЖрдзрд╛рд░ рдЕрдиреБрдмрдВрдз рдХреЗ initialize рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред execute() рд╕рдЪ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрдм рдореИрдВ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ:

// deploy/01_deploy_skin_rewards.js

module.exports = async ({
  getNamedAccounts,
  deployments,
}) => {
  const {deploy} = deployments;
  const {deployer} = await getNamedAccounts();
  await deploy('SkinRewards', {
    from: deployer,
    proxy: {
      owner: deployer,
      proxyContract: 'OpenZeppelinTransparentProxy',
    },
    args: [],
    log: true,
  });
};
module.exports.tags = ['SkinRewards'];

рдФрд░ рдлрд┐рд░

// deploy/02_init_skin_rewards.js

require('dotenv').config();
const RewardPeriods = ethers.BigNumber.from(process.env.REWARD_PERIODS);
module.exports = async ({getNamedAccounts, deployments}) => {
  const { deployer } = await getNamedAccounts();
  const SnookGame = await deployments.get('SnookGame');
  const SnookState = await deployments.get('SnookState');
  const SnookToken = await deployments.get('SnookToken');
  const SkillToken = await deployments.get('SkillToken');
  const Afterdeath = await deployments.get('Afterdeath');
  const Treasury = await deployments.get('Treasury');

  await deployments.execute(
    'SkinRewards',
    {from:deployer},
    'initialize',
    RewardPeriods,
    Treasury.address,
    SnookGame.address,
    SnookState.address,
    SnookToken.address,
    SkillToken.address,
    Afterdeath.address
  );
  deployments.log('Initialized SkinRewards');
  return true;
};
module.exports.tags = ['initSkinRewards'];
module.exports.id = 'initSkinRewards';

рдХреНрдпрд╛ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ _рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕_ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕реЗ рд╡реИрд╕реЗ рд╣реА рдЦреЛрдЬрд╛ рд╣реИ?

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, SkinRewards рдореЗрдВ рдореБрдЭреЗ OpenZeppelin рдХреЗ Initializable рдЕрдиреБрдмрдВрдз рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ initialize() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╣рд▓реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдкреЛрд╕реНрдЯрдЕрдкрдЧреНрд░реЗрдб рдХреИрд╕реЗ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рддреБрдо рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реЛ? рдзрдиреНрдпрд╡рд╛рдж

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, methodName ("рдкреЛрд╕реНрдЯрдЕрдкрдЧреНрд░реЗрдб") рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк 1 рдХреЗ рдмрдЬрд╛рдп 2 рдЯреАрдПрдХреНрд╕ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ

рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдлрдВрдХреНрд╢рди рдХреЛ рдЗрдбрдореНрдкреЛрдЯреЗрдВрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдпрд╛рдиреА рдЗрд╕реЗ рдмрд┐рдирд╛ рдереНрд░реЛ рдХрд┐рдП рдХрдИ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд▓реЗрдВ рдХрд┐ рдЖрдЧреЗ рдХреА рдХреЙрд▓ рд╕реНрдЯреЗрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧреА (рдпрджрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реЛ рддреЛ рд╕реНрдХрд┐рдк рдХрд░рдХреЗ), рддреЛ рдЖрдк рдЗрд╕реЗ methodName рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред . рдкрд╣рд▓реА рддреИрдирд╛рддреА рднреА рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧреАред

рдзреНрдпрд╛рди рджреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдлрд╝рдВрдХреНрд╢рди рд╕реЗрдЯрдЕрдк рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдкреНрд░реЙрдХреНрд╕реА рд╡рд┐рдХрд▓реНрдк рдХреЛ рдмрдВрдж рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЕрдиреБрдмрдВрдз рд╣реЛ, methodName рд╡рд┐рдХрд▓реНрдк рддрд░реНрдХ рдХреЗ рд▓рд┐рдП args рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рднреА рдЗрди рддрд░реНрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдмрд┐рдирд╛ рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдиреБрдмрдВрдз рдореЗрдВ рд╢реВрдиреНрдп рддрд░реНрдХ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ред

рдпрд╣рд╛рдВ methodName рд╡рд┐рдХрд▓реНрдк рд╡рд╛рд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛрдЧреА:

// deploy/01_deploy_skin_rewards.js

module.exports = async ({
  getNamedAccounts,
  deployments,
}) => {
  const {deploy} = deployments;
  const {deployer} = await getNamedAccounts();
  await deploy('SkinRewards', {
    from: deployer,
    proxy: {
      methodName: 'initialize`,
      owner: deployer,
      proxyContract: 'OpenZeppelinTransparentProxy',
    },
    args: [
      RewardPeriods,
      Treasury.address,
      SnookGame.address,
      SnookState.address,
      SnookToken.address,
      SkillToken.address,
      Afterdeath.address
    ],
    log: true,
  });
};
module.exports.tags = ['SkinRewards'];

_рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдлрдВрдХреНрд╢рди рдХреЛ рдЗрдбрдореНрдкреЛрдЯреЗрдВрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдпрд╛рдиреА рдЗрд╕реЗ рдмрд┐рдирд╛ рдереНрд░реЛ рдХрд┐рдП рдХрдИ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд▓реЗрдВ рдХрд┐ рдЖрдЧреЗ рдХреА рдХреЙрд▓ рд╕реНрдЯреЗрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧреА (рдпрджрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реЛ рддреЛ рд╕реНрдХрд┐рдк рдХрд░рдХреЗ), рддреЛ рдЖрдк рдЗрд╕реЗ рдореЗрдердбрдирд╛рдо рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реА рддреИрдирд╛рддреА рдЗрд╕реЗ рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧреАред_

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо https://github.com/OpenZeppelin/openzeppelin-contracts-upgradable/blob/release-v4.0/contracts/proxy/utils/Initializable.sol рд╕реЗ AS-IS рдлрд╝рдВрдХреНрд╢рди initialize() рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред .

@рдлреНрд░реАрдмрд╛рдЗрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ

рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛

рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рддреИрдирд╛рдд рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВ Uniswap рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣рд╛ рд╣реВрдБред

рдкреНрд▓рдЧрдЗрди рдбреЙрдХреНрд╕ рдХреЗ рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рд╕реЗ рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдореИрдВ рддреИрдирд╛рдд рдпреВрдирд┐рд╕реНрд╡реИрдк рдЕрдиреБрдмрдВрдз рдХреЗ рдкрддреЗ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реВрдВред Uniswap NPM рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде build рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рдЕрдиреБрдмрдВрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдХреИрд╕реЗ рдмрдирд╛рдКрдВ? рд╣рдо рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдИрдерд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдо рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

const { ethers } = require("hardhat");

const UniswapV2FactoryArtifact = require('@uniswap/v2-core/build/UniswapV2Factory.json');
const UniswapV2FactoryAddress = '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f';

module.exports = async ({getNamedAccounts, deployments}) => {
  const {deployer} = await getNamedAccounts();
  const UniswapFactory = await ethers.getContractAt(UniswapV2FactoryArtifact.abi, UniswapV2FactoryAddress);
// continue...

рдореИрдВ deployments var рдореЗрдВ Uniswap рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реВрдВ?

рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ
рдЗрд╕рд▓рд┐рдП рдореЗрдирдиреЗрдЯ рдпреВрдирд┐рд╕реНрд╡реИрдк рдХреЗ рд▓рд┐рдП рдФрд░ рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣рд╛рд░реНрдбрд╣реИрдЯ.рдХреЙрдиреНрдлрд┐рдЧ.рдЬреЗрдПрд╕ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдореЗрдирдиреЗрдЯ рдиреЗрдЯрд╡рд░реНрдХ рд╣реИ, рдЖрдк "рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯреНрд╕/рдореЗрдирдиреЗрдЯ/рдпреВрдирд┐рд╕реНрд╡рд╛рдкрдлреИрдХреНрдЯрд░реА.рдЬреЗрд╕рди" рдлрд╛рдЗрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХрдо рд╕реЗ рдХрдо рдЗрд╕реЗ рдПрдХ рдкрддрд╛ рдФрд░ рдЕрдмреА рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рддрдм рдЖрдк рдЙрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рддреИрдирд╛рддреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдЖрдк рдЬрд┐рд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд▓рд┐рдВрдХ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рдЖрдкрдХреЛ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ (рдЗрд╕рд▓рд┐рдП uniswap рдмрд┐рд▓реНрдб рдлрд╝реЛрд▓реНрдбрд░) рдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рд╡рд╛рд▓рд╛ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдкреНрд░рд╢реНрди рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдиреЗ рдЗрди рддреИрдирд╛рддреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХрд╣реАрдВ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдпрд╛ рд╣реЛ

рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬреИрд╕реЗ https://github.com/wighawag/universal-forwarder рдореЗрдВ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреЗрд╡рд▓ npm рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╡реЗ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдпрд╛ рдЕрдкрдиреЗ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рддреИрдирд╛рдд рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди uniswap рд╡рд╣ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдорд╣рд╛рдиред рдмрд╣реБрдд - рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд▓рд┐рдП рдкреБрди: рдкреНрд░рд╛рд░рдВрдн рдХрд╛рд░реНрдп

рдореИрдВрдиреЗ рд╣рд╛рд░реНрдбрд╣реИрдЯ-рддреИрдирд╛рддреА 0.8.0 рдореЗрдВ рдПрдХ рдирдпрд╛ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рд╛ ( methodName рдХреЗ рдмрдЬрд╛рдп рдЬреЛ рдЕрднреА рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ)

рджреЗрдЦреЗрдВ https://github.com/wighawag/template-ethereum-contracts/blob/595c1b5ec9cdf1276f4d3a43b4825bcef78bd2cd/deploy/004_deploy_erc20_always_proxied_via_openzeppelin_proxy.ts#L12 -L26

рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдЖрддреА рд╣реИ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

tennox picture tennox  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lepidotteri picture lepidotteri  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lcswillems picture lcswillems  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gitpusha picture gitpusha  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

smartcontracts picture smartcontracts  ┬╖  20рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ