refactor: deployment script to accept argument inputs (#146)
This commit is contained in:
parent
c8a63b8618
commit
8e309ee04c
|
|
@ -3,6 +3,7 @@
|
||||||
## Folder Structure
|
## Folder Structure
|
||||||
|
|
||||||
Inside contracts you are going to find:
|
Inside contracts you are going to find:
|
||||||
|
|
||||||
- [contracts](./contracts): all the developed contracts
|
- [contracts](./contracts): all the developed contracts
|
||||||
- [deployments](./deployments): resultant ABI and info for deployments (each network will have a nested folder)
|
- [deployments](./deployments): resultant ABI and info for deployments (each network will have a nested folder)
|
||||||
- [lib](./lib): external modules used by Foundry
|
- [lib](./lib): external modules used by Foundry
|
||||||
|
|
@ -23,7 +24,7 @@ The contracts present in this project are based in [Solidity](https://github.com
|
||||||
|
|
||||||
> ⚠️ Before starting developing make sure you Solidity, Node.js and yarn correctly installed in your environment
|
> ⚠️ Before starting developing make sure you Solidity, Node.js and yarn correctly installed in your environment
|
||||||
|
|
||||||
Also, make sure you run `yarn` at the root directory to get some required tools. The rest of these steps assume you are in the [contracts folder](./).
|
Also, make sure you run `yarn` at the root directory to get some required tools. The rest of these steps assume you are in the [contracts folder](./).
|
||||||
|
|
||||||
Follow the steps:
|
Follow the steps:
|
||||||
|
|
||||||
|
|
@ -153,6 +154,23 @@ $ yarn deploy:mumbai
|
||||||
|
|
||||||
to deploy the contract on the testnet. Please note that your wallet needs to hold enough Mumbai MATIC for the deployment to be successful. To reach more in-depth information about how to deploy contract checkout [this guide](https://wiki.polygon.technology/docs/develop/alchemy).
|
to deploy the contract on the testnet. Please note that your wallet needs to hold enough Mumbai MATIC for the deployment to be successful. To reach more in-depth information about how to deploy contract checkout [this guide](https://wiki.polygon.technology/docs/develop/alchemy).
|
||||||
|
|
||||||
|
### **Deploy arguments**
|
||||||
|
|
||||||
|
For any of the deploy scripts above you are able to input arguments to change the date sent during the deployment. They are:
|
||||||
|
|
||||||
|
| Argument | Description | Example | Default |
|
||||||
|
| -------------------- | ----------------------------------------- | -------------------------- | --------- |
|
||||||
|
| --new-proxy-instance | Force to deploy a new proxy instance | --new-proxy-instance | false |
|
||||||
|
| --name | The collection name | --name "Fleek NFAs" | FleekNFAs |
|
||||||
|
| --symbol | The collection symbol | --symbol "FKNFA" | FLKNFA |
|
||||||
|
| --billing | The billing values in an array of numbers | --billing "[10000, 20000]" | [] |
|
||||||
|
|
||||||
|
Appending all of them together would be like:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ yarn deploy:hardhat --new-proxy-instance --name "Fleek NFAs" --symbol "FKNFA" --billing "[10000, 20000]"
|
||||||
|
```
|
||||||
|
|
||||||
<!-- TODO: add this section after the mainnet setup is done and tested
|
<!-- TODO: add this section after the mainnet setup is done and tested
|
||||||
**Polygon main-net**
|
**Polygon main-net**
|
||||||
|
|
||||||
|
|
@ -188,4 +206,4 @@ The project should provide a way for interacting with the contract as owner with
|
||||||
|
|
||||||
> 🛠️ Work in progress...
|
> 🛠️ Work in progress...
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ import 'hardhat-contract-sizer';
|
||||||
import '@openzeppelin/hardhat-upgrades';
|
import '@openzeppelin/hardhat-upgrades';
|
||||||
import * as dotenv from 'dotenv';
|
import * as dotenv from 'dotenv';
|
||||||
import { HardhatUserConfig } from 'hardhat/types';
|
import { HardhatUserConfig } from 'hardhat/types';
|
||||||
|
import { task, types } from 'hardhat/config';
|
||||||
|
import deploy from './scripts/deploy';
|
||||||
|
|
||||||
dotenv.config();
|
dotenv.config();
|
||||||
|
|
||||||
|
|
@ -65,3 +67,16 @@ const config: HardhatUserConfig = {
|
||||||
};
|
};
|
||||||
|
|
||||||
export default config;
|
export default config;
|
||||||
|
|
||||||
|
// npx hardhat deploy --network mumbai --new-proxy-instance --name "FleekNFAs" --symbol "FLKNFA" --billing "[10000, 20000]"
|
||||||
|
task('deploy', 'Deploy the contracts')
|
||||||
|
.addFlag('newProxyInstance', 'Force to deploy a new proxy instance')
|
||||||
|
.addOptionalParam('name', 'The collection name', 'FleekNFAs', types.string)
|
||||||
|
.addOptionalParam('symbol', 'The collection symbol', 'FLKNFA', types.string)
|
||||||
|
.addOptionalParam(
|
||||||
|
'billing',
|
||||||
|
'The billing values in an array of numbers like "[10000, 20000]"',
|
||||||
|
[],
|
||||||
|
types.json
|
||||||
|
)
|
||||||
|
.setAction(deploy);
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@
|
||||||
"test:hardhat": "hardhat test",
|
"test:hardhat": "hardhat test",
|
||||||
"format": "prettier --write \"./**/*.{js,json,sol,ts}\"",
|
"format": "prettier --write \"./**/*.{js,json,sol,ts}\"",
|
||||||
"node:hardhat": "hardhat node",
|
"node:hardhat": "hardhat node",
|
||||||
"deploy:hardhat": "hardhat run scripts/deploy.js --network hardhat",
|
"deploy:hardhat": "hardhat deploy --network hardhat",
|
||||||
"deploy:mumbai": "hardhat run scripts/deploy.js --network mumbai",
|
"deploy:mumbai": "hardhat deploy --network mumbai",
|
||||||
"compile": "hardhat compile",
|
"compile": "hardhat compile",
|
||||||
"verify:mumbai": "npx hardhat run ./scripts/verify-polyscan.js --network mumbai"
|
"verify:mumbai": "npx hardhat run ./scripts/verify-polyscan.js --network mumbai"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -4,22 +4,14 @@ const {
|
||||||
} = require('./utils/deploy-store');
|
} = require('./utils/deploy-store');
|
||||||
const { getProxyAddress, proxyStore } = require('./utils/proxy-store');
|
const { getProxyAddress, proxyStore } = require('./utils/proxy-store');
|
||||||
|
|
||||||
// --- Inputs ---
|
|
||||||
const ARGUMENTS = [
|
|
||||||
'FleekNFAs', // Collection name
|
|
||||||
'FLKNFA', // Collection symbol
|
|
||||||
[], // Billing values
|
|
||||||
];
|
|
||||||
|
|
||||||
// --- Script Settings ---
|
// --- Script Settings ---
|
||||||
const CONTRACT_NAME = 'FleekERC721';
|
const CONTRACT_NAME = 'FleekERC721';
|
||||||
const NETWORK = hre.network.name;
|
|
||||||
const DEFAULT_PROXY_SETTINGS = {
|
const DEFAULT_PROXY_SETTINGS = {
|
||||||
unsafeAllow: ['external-library-linking'],
|
unsafeAllow: ['external-library-linking'],
|
||||||
};
|
};
|
||||||
const LIBRARIES_TO_DEPLOY = ['FleekSVG'];
|
const LIBRARIES_TO_DEPLOY = ['FleekSVG'];
|
||||||
|
|
||||||
const libraryDeployment = async () => {
|
const libraryDeployment = async (hre) => {
|
||||||
console.log('Deploying Libraries...');
|
console.log('Deploying Libraries...');
|
||||||
const libraries = {};
|
const libraries = {};
|
||||||
|
|
||||||
|
|
@ -33,7 +25,7 @@ const libraryDeployment = async () => {
|
||||||
const libContract = await hre.ethers.getContractFactory(lib);
|
const libContract = await hre.ethers.getContractFactory(lib);
|
||||||
const libInstance = await libContract.deploy();
|
const libInstance = await libContract.deploy();
|
||||||
await libInstance.deployed();
|
await libInstance.deployed();
|
||||||
deployStore(NETWORK, lib, libInstance);
|
deployStore(hre.network.name, lib, libInstance);
|
||||||
console.log(`Library "${lib}" deployed at ${libInstance.address}`);
|
console.log(`Library "${lib}" deployed at ${libInstance.address}`);
|
||||||
libraries[lib] = libInstance.address;
|
libraries[lib] = libInstance.address;
|
||||||
}
|
}
|
||||||
|
|
@ -41,55 +33,70 @@ const libraryDeployment = async () => {
|
||||||
return libraries;
|
return libraries;
|
||||||
};
|
};
|
||||||
|
|
||||||
const main = async () => {
|
module.exports = async (taskArgs, hre) => {
|
||||||
console.log(':: Starting Deployment ::');
|
const { newProxyInstance, name, symbol, billing } = taskArgs;
|
||||||
console.log('Network:', NETWORK);
|
const network = hre.network.name;
|
||||||
console.log('Contract:', CONTRACT_NAME);
|
|
||||||
|
|
||||||
const libraries = await libraryDeployment();
|
console.log(':: Starting Deployment ::');
|
||||||
|
console.log('Network:', network);
|
||||||
|
console.log('Contract:', CONTRACT_NAME);
|
||||||
|
console.log(':: Arguments ::');
|
||||||
|
console.log(taskArgs);
|
||||||
|
console.log();
|
||||||
|
|
||||||
|
const arguments = [name, symbol, billing];
|
||||||
|
|
||||||
|
const libraries = await libraryDeployment(hre);
|
||||||
|
|
||||||
const Contract = await ethers.getContractFactory(CONTRACT_NAME, {
|
const Contract = await ethers.getContractFactory(CONTRACT_NAME, {
|
||||||
libraries,
|
libraries,
|
||||||
});
|
});
|
||||||
const proxyAddress = await getProxyAddress(CONTRACT_NAME, NETWORK);
|
const proxyAddress = await getProxyAddress(CONTRACT_NAME, network);
|
||||||
|
|
||||||
let deployResult;
|
let deployResult;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (!proxyAddress) throw new Error('No proxy address found');
|
if (!proxyAddress || newProxyInstance)
|
||||||
|
throw new Error('new-proxy-instance');
|
||||||
console.log(`Trying to upgrade proxy contract at: "${proxyAddress}"`);
|
console.log(`Trying to upgrade proxy contract at: "${proxyAddress}"`);
|
||||||
deployResult = await upgrades.upgradeProxy(
|
deployResult = await upgrades.upgradeProxy(
|
||||||
proxyAddress,
|
proxyAddress,
|
||||||
Contract,
|
Contract,
|
||||||
DEFAULT_PROXY_SETTINGS
|
DEFAULT_PROXY_SETTINGS
|
||||||
);
|
);
|
||||||
|
|
||||||
|
console.log('\x1b[32m');
|
||||||
console.log(
|
console.log(
|
||||||
`Contract ${CONTRACT_NAME} upgraded at "${deployResult.address}" by account "${deployResult.signer.address}"`
|
`Contract ${CONTRACT_NAME} upgraded at "${deployResult.address}" by account "${deployResult.signer.address}"`
|
||||||
);
|
);
|
||||||
await deployStore(NETWORK, CONTRACT_NAME, deployResult);
|
console.log('\x1b[0m');
|
||||||
|
await deployStore(network, CONTRACT_NAME, deployResult);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (
|
if (
|
||||||
e.message === 'No proxy address found' ||
|
e.message === 'new-proxy-instance' ||
|
||||||
e.message.includes("doesn't look like an ERC 1967 proxy")
|
e.message.includes("doesn't look like an ERC 1967 proxy")
|
||||||
) {
|
) {
|
||||||
console.log(`Failed to upgrade proxy contract: "${e.message?.trim()}"`);
|
console.log(`Failed to upgrade proxy contract: "${e.message?.trim()}"`);
|
||||||
console.log('Creating new proxy contract...');
|
console.log('Creating new proxy contract...');
|
||||||
deployResult = await upgrades.deployProxy(
|
deployResult = await upgrades.deployProxy(
|
||||||
Contract,
|
Contract,
|
||||||
ARGUMENTS,
|
arguments,
|
||||||
DEFAULT_PROXY_SETTINGS
|
DEFAULT_PROXY_SETTINGS
|
||||||
);
|
);
|
||||||
await deployResult.deployed();
|
await deployResult.deployed();
|
||||||
await proxyStore(CONTRACT_NAME, deployResult.address, hre.network.name);
|
await proxyStore(CONTRACT_NAME, deployResult.address, network);
|
||||||
|
|
||||||
|
console.log('\x1b[32m');
|
||||||
console.log(
|
console.log(
|
||||||
`Contract ${CONTRACT_NAME} deployed at "${deployResult.address}" by account "${deployResult.signer.address}"`
|
`Contract ${CONTRACT_NAME} deployed at "${deployResult.address}" by account "${deployResult.signer.address}"`
|
||||||
);
|
);
|
||||||
|
console.log('\x1b[0m');
|
||||||
} else {
|
} else {
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await deployStore(NETWORK, CONTRACT_NAME, deployResult);
|
await deployStore(network, CONTRACT_NAME, deployResult);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Could not write deploy files', e);
|
console.error('Could not write deploy files', e);
|
||||||
}
|
}
|
||||||
|
|
@ -97,5 +104,3 @@ const main = async () => {
|
||||||
|
|
||||||
return deployResult;
|
return deployResult;
|
||||||
};
|
};
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue