Skip to content

Commit d967ad1

Browse files
add script for adding implementation for released contracts (#225)
* add script for adding implementation for released contracts * comments * fix package.json * correct abi Co-authored-by: Yash <kumaryashcse@gmail.com>
1 parent 65fea18 commit d967ad1

File tree

4 files changed

+426
-2
lines changed

4 files changed

+426
-2
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"@openzeppelin/contracts": "4.5.0",
1616
"@openzeppelin/contracts-upgradeable": "4.5.1",
1717
"@primitivefi/hardhat-dodoc": "^0.2.0",
18+
"@thirdweb-dev/sdk": "^2.3.39",
1819
"@typechain/ethers-v5": "^10.0.0",
1920
"@typechain/hardhat": "^4.0.0",
2021
"@types/fs-extra": "^9.0.13",
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import "dotenv/config";
2+
import { SUPPORTED_CHAIN_ID, ThirdwebSDK } from "@thirdweb-dev/sdk";
3+
import { readFileSync } from "fs";
4+
import { chainIdToName } from "./constants";
5+
6+
////// To run this script: `npx ts-node scripts/release/add_implementations_from_release.ts` //////
7+
///// MAKE SURE TO PUT IN THE RIGHT CONTRACT NAME HERE AFTER CREATING A RELEASE FOR IT /////
8+
//// THE RELEASE SHOULD HAVE THE IMPLEMENTATIONS ALREADY DEPLOYED AND RECORDED (via dashboard) ////
9+
const releasedContractName = "SignatureDrop";
10+
const privateKey: string = process.env.DEPLOYER_KEY as string; // should be the correct deployer key
11+
12+
const polygonSDK = ThirdwebSDK.fromPrivateKey(privateKey, "polygon");
13+
14+
async function main() {
15+
const releaser = await polygonSDK.wallet.getAddress();
16+
console.log("Releasing as", releaser);
17+
18+
const latest = await polygonSDK.getPublisher().getLatest(releaser, releasedContractName);
19+
20+
if (latest && latest.metadataUri) {
21+
console.log(latest);
22+
const prev = await polygonSDK.getPublisher().fetchPublishedContractInfo(latest);
23+
24+
console.log("Fetched latest version", prev);
25+
const prevReleaseMetadata = prev.publishedMetadata;
26+
27+
const implementations = prev.publishedMetadata.factoryDeploymentData?.implementationAddresses;
28+
console.log("Implementations", implementations);
29+
30+
if (!implementations) {
31+
console.log("No implementations to approve");
32+
return;
33+
}
34+
35+
// Adding implementations
36+
console.log("Adding implementations...");
37+
for (const [chainId, implementation] of Object.entries(implementations)) {
38+
const chainName = chainIdToName[parseInt(chainId) as SUPPORTED_CHAIN_ID];
39+
const chainSDK = ThirdwebSDK.fromPrivateKey(privateKey, chainName);
40+
const factoryAddr = prevReleaseMetadata?.factoryDeploymentData?.factoryAddresses?.[chainId];
41+
if (implementation && factoryAddr) {
42+
const factory = chainSDK.getContractFromAbi(
43+
factoryAddr,
44+
JSON.parse(readFileSync("artifacts_forge/TWFactory.sol/TWFactory.json", "utf-8")).abi,
45+
);
46+
const approved = await factory.call("approval", implementation);
47+
if (!approved) {
48+
try {
49+
console.log("Adding implementation", implementation, "on", chainName, "to", factoryAddr);
50+
await factory.call("addImplementation", implementation);
51+
} catch (e) {
52+
console.log("Failed to add implementation on", chainName, e);
53+
}
54+
} else {
55+
console.log("Implementation", implementation, "already approved on", chainName);
56+
}
57+
} else {
58+
console.log("No implementation or factory address for", chainName);
59+
}
60+
}
61+
} else {
62+
console.log("No previous release found");
63+
return;
64+
}
65+
66+
console.log("All done.");
67+
console.log("Release page:", `https://thirdweb.com/${releaser}/${releasedContractName}`);
68+
}
69+
70+
main()
71+
.then(() => process.exit(0))
72+
.catch(e => {
73+
console.error(e);
74+
process.exit(1);
75+
});

scripts/release/constants.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { ChainId, CONTRACT_ADDRESSES } from "@thirdweb-dev/sdk";
2+
3+
export const nativeTokenWrapper: Record<number, string> = {
4+
1: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", // mainnet
5+
4: "0xc778417E063141139Fce010982780140Aa0cD5Ab", // rinkeby
6+
5: "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6", // goerli
7+
137: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", // polygon
8+
80001: "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", // mumbai
9+
43114: "0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7", // avalanche
10+
43113: "0xd00ae08403B9bbb9124bB305C09058E32C39A48c", // avalanche fuji testnet
11+
250: "0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83", // fantom
12+
4002: "0xf1277d1Ed8AD466beddF92ef448A132661956621", // fantom testnet
13+
10: "0x4200000000000000000000000000000000000006", // optimism
14+
69: "0xbC6F6b680bc61e30dB47721c6D1c5cde19C1300d", // optimism testnet
15+
42161: "0x82af49447d8a07e3bd95bd0d56f35241523fbab1", // arbitrum
16+
421611: "0xEBbc3452Cc911591e4F18f3b36727Df45d6bd1f9", // arbitrum testnet
17+
};
18+
19+
export const chainIdToName: Record<number, string> = {
20+
[ChainId.Mumbai]: "mumbai",
21+
[ChainId.Rinkeby]: "rinkeby",
22+
[ChainId.Goerli]: "goerli",
23+
[ChainId.Polygon]: "polygon",
24+
[ChainId.Mainnet]: "mainnet",
25+
[ChainId.Optimism]: "optimism",
26+
[ChainId.OptimismTestnet]: "optimism-testnet",
27+
[ChainId.Arbitrum]: "arbitrum",
28+
[ChainId.ArbitrumTestnet]: "arbitrum-testnet",
29+
[ChainId.Fantom]: "fantom",
30+
[ChainId.FantomTestnet]: "fantom-testnet",
31+
[ChainId.Avalanche]: "avalanche",
32+
[ChainId.AvalancheFujiTestnet]: "avalanche-testnet",
33+
// [ChainId.BinanceSmartChainMainnet]: "binance",
34+
// [ChainId.BinanceSmartChainTestnet]: "binance-testnet",
35+
};
36+
37+
export const defaultFactories: Record<number, string> = {
38+
[ChainId.Mainnet]: CONTRACT_ADDRESSES[ChainId.Mainnet].twFactory,
39+
[ChainId.Goerli]: CONTRACT_ADDRESSES[ChainId.Goerli].twFactory,
40+
[ChainId.Rinkeby]: CONTRACT_ADDRESSES[ChainId.Rinkeby].twFactory,
41+
[ChainId.Polygon]: CONTRACT_ADDRESSES[ChainId.Polygon].twFactory,
42+
[ChainId.Mumbai]: CONTRACT_ADDRESSES[ChainId.Mumbai].twFactory,
43+
[ChainId.Fantom]: CONTRACT_ADDRESSES[ChainId.Fantom].twFactory,
44+
[ChainId.FantomTestnet]: CONTRACT_ADDRESSES[ChainId.FantomTestnet].twFactory,
45+
[ChainId.Optimism]: CONTRACT_ADDRESSES[ChainId.Optimism].twFactory,
46+
[ChainId.OptimismTestnet]: CONTRACT_ADDRESSES[ChainId.OptimismTestnet].twFactory,
47+
[ChainId.Arbitrum]: CONTRACT_ADDRESSES[ChainId.Arbitrum].twFactory,
48+
[ChainId.ArbitrumTestnet]: CONTRACT_ADDRESSES[ChainId.ArbitrumTestnet].twFactory,
49+
[ChainId.Avalanche]: CONTRACT_ADDRESSES[ChainId.Avalanche].twFactory,
50+
[ChainId.AvalancheFujiTestnet]: CONTRACT_ADDRESSES[ChainId.AvalancheFujiTestnet].twFactory,
51+
};

0 commit comments

Comments
 (0)