OpenZeppelin рдЙрдиреНрдирдпрди рдпреЛрдЧреНрдп рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?
OpenZeppelin upgrdable рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ () рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рд╛рд░реНрдбрд╣реИрдЯ рдЕрдкрдЧреНрд░реЗрдб рдкреНрд▓рдЧрдЗрди рджреНрд╡рд╛рд░рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рд╛рд░реНрдбрд╣реИрдЯ-рддреИрдирд╛рддреА рд╕реЗ рдХреЛрдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреЙрд▓ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдкреЛрд╕реНрдЯ-рдЕрдкрдЧреНрд░реЗрдб рд╡рд┐рдзрд┐ рдЬрд┐рд╕реЗ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдореБрдЭреЗ рдкрд╣рд▓реЗ рддреИрдирд╛рддреА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░ рддреИрдирд╛рддреА рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдмрд╛рд╣рд░ рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╛ рддреИрдирд╛рддреА рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рд╣реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?
рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рд╛рд░реНрдбрд╣реИрдЯ-рддреИрдирд╛рддреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдмреЗрдХрд╛рд░ рд╣реИрдВред рдкреНрд░реЙрдХреНрд╕реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкрд░ рднреА рдпрд╣реА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдХрд╛рд╕/рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕ рд░рд╛рдЬреНрдп рдореЗрдВ рдмрдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╣рд╛рд░реНрдбрд╣реИрдЯ-рддреИрдирд╛рддреА рдЙрд╕ рд░рд╛рдЬреНрдп рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХрд░ рджреЗрдЧреА,
рддреЛ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЕрдкрдиреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдп рдХреЛ рдмреЗрдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рд╛рд░рдВрдн рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреЛрд╕реНрдЯ рдЕрдкрдЧреНрд░реЗрдб рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рд╕рднреА рдареАрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдореИрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдлрдВрдХреНрд╢рди рдХреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдБ рдЬрдм рдореИрдВ рдЬрд╝рд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рддрд╛ рд╣реВрдБред
рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдЧреНрд░реЗрдб рдХреЛ рдЕрд▓рдЧ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЕрдзреАрди рд╣реИ: 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.8.0 рдореЗрдВ рдПрдХ рдирдпрд╛ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рд╛ (
methodName
рдХреЗ рдмрдЬрд╛рдп рдЬреЛ рдЕрднреА рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ)рджреЗрдЦреЗрдВ https://github.com/wighawag/template-ethereum-contracts/blob/595c1b5ec9cdf1276f4d3a43b4825bcef78bd2cd/deploy/004_deploy_erc20_always_proxied_via_openzeppelin_proxy.ts#L12 -L26
рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдЖрддреА рд╣реИ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ