Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion packages/contracts/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ PROD_AWS_ACCESS_KEY_ID=
PROD_AWS_SECRET_ACCESS_KEY=
# The following are only required if using Art Blocks Deployment Scripts
# Three Hasura environments: dev, staging, prod
# prod serves all mainnets (ethereum, base, arbitrum) distinguished by chain_id
# prod serves all mainnets (ethereum, base, arbitrum, shape) distinguished by chain_id
GRAPHQL_API_ENDPOINT_DEV=
HASURA_ADMIN_SECRET_DEV=
GRAPHQL_API_ENDPOINT_STAGING=
Expand All @@ -27,5 +27,7 @@ ARBITRUM_GOERLI_JSON_RPC_PROVIDER_URL=
# The following is only required if deploying on Base
BASESCAN_API_KEY=
BASE_MAINNET_JSON_RPC_PROVIDER_URL=
# The following is only required if deploying on Shape mainnet (chain ID 360)
SHAPE_MAINNET_JSON_RPC_PROVIDER_URL=
# The following is only required if deploying on Hoodi testnet
HOODI_JSON_RPC_PROVIDER_URL=
44 changes: 34 additions & 10 deletions packages/contracts/INFRASTRUCTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,30 @@ erDiagram
}
```

### Shape

```mermaid
---
title: Shape setup (mainnet, chain ID 360)
---
erDiagram
DeployerMultisig ||--|| EngineFactory : owns
EngineFactory ||--|| CoreRegistry : owns
EngineFactory ||--|| UniversalBytecodeStorageReader : initializes-cores-with
DeployerMultisig {
addr _TBD
}
EngineFactory {
addr _TBD
}
CoreRegistry {
addr _TBD
}
UniversalBytecodeStorageReader {
addr _TBD
}
```

### Sepolia (artist staging)

```mermaid
Expand Down Expand Up @@ -168,14 +192,14 @@ The following contracts were deployed by Art Blocks on various production networ

They are included here for reference purposes.

| Contract/Library (network:Contract) | Address |
| --------------------------------------- | -------------------------------------------- |
| mainnet:EngineFactory (v3.2.4, v3.2.5) | `0x00000000D0A0E78e243625Dbb4A5B37286Eac629` |
| arbitrum:EngineFactory (v3.2.4, v3.2.5) | `0x000000D60eeC180eDC00001173dE37ACd269b196` |
| base:EngineFactory (v3.2.4, v3.2.5) | `0x0000000005aBb84fF93f599a6309cA71a6DD4e4E` |
| Contract/Library (network:Contract) | Address |
| ---------------------------------------------- | -------------------------------------------- |
| mainnet:EngineFactory (v3.2.4, v3.2.5) | `0x00000000D0A0E78e243625Dbb4A5B37286Eac629` |
| arbitrum:EngineFactory (v3.2.4, v3.2.5) | `0x000000D60eeC180eDC00001173dE37ACd269b196` |
| base:EngineFactory (v3.2.4, v3.2.5) | `0x0000000005aBb84fF93f599a6309cA71a6DD4e4E` |
| sepolia-staging:EngineFactory (v3.2.4, v3.2.5) | `0x000000ab19F142143f03f96E2Bdf068474E50b7D` |
| sepolia-dev:EngineFactory (v3.2.4, v3.2.5) | `0x0000000765f79939e1Abb63C266cE983bd5eF5c0` |
| mainnet:EngineFactory (v3.2.2, v3.2.3) | `0x000000AB1a0786eE8c71516d9AbB8a36fbdDb7CB` |
| arbitrum:EngineFactory (v3.2.2, v3.2.3) | `0x000000da9D51CC51a50Dc296246075859b13ab0B` |
| mainnet:EngineFactory (v3.2.0, v3.2.1) | `0x00000000F82E4e6D5AB22D63050FCb2bF15eE95d` |
| arbitrum:EngineFactory (v3.2.0, v3.2.1) | `0x000000bbAA3E36b60C06A92430D8956459c2Fd51` |
| sepolia-dev:EngineFactory (v3.2.4, v3.2.5) | `0x0000000765f79939e1Abb63C266cE983bd5eF5c0` |
| mainnet:EngineFactory (v3.2.2, v3.2.3) | `0x000000AB1a0786eE8c71516d9AbB8a36fbdDb7CB` |
| arbitrum:EngineFactory (v3.2.2, v3.2.3) | `0x000000da9D51CC51a50Dc296246075859b13ab0B` |
| mainnet:EngineFactory (v3.2.0, v3.2.1) | `0x00000000F82E4e6D5AB22D63050FCb2bF15eE95d` |
| arbitrum:EngineFactory (v3.2.0, v3.2.1) | `0x000000bbAA3E36b60C06A92430D8956459c2Fd51` |
19 changes: 19 additions & 0 deletions packages/contracts/hardhat.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ const ARBITRUM_MAINNET_JSON_RPC_PROVIDER_URL =
const BASE_MAINNET_JSON_RPC_PROVIDER_URL =
process.env.BASE_MAINNET_JSON_RPC_PROVIDER_URL || "";

const SHAPE_MAINNET_JSON_RPC_PROVIDER_URL =
process.env.SHAPE_MAINNET_JSON_RPC_PROVIDER_URL || "";

const HOODI_JSON_RPC_PROVIDER_URL =
process.env.HOODI_JSON_RPC_PROVIDER_URL || "";

Expand Down Expand Up @@ -95,6 +98,14 @@ module.exports = {
gasMultiplier: 1.5,
maxNominalGasPriceGwei: 50,
},
shape: {
url: SHAPE_MAINNET_JSON_RPC_PROVIDER_URL,
accounts: [`${PRIVATE_KEY}`],
// ledgerAccounts: ["0x"],
gasPrice: "auto",
gasMultiplier: 1.5,
maxNominalGasPriceGwei: 50,
},
hoodi: {
url: HOODI_JSON_RPC_PROVIDER_URL,
accounts: [`${PRIVATE_KEY}`],
Expand Down Expand Up @@ -127,6 +138,14 @@ module.exports = {
browserURL: "https://hoodi.etherscan.io",
},
},
{
network: "shape",
chainId: 360,
urls: {
apiURL: "https://shapescan.xyz/api",
browserURL: "https://shapescan.xyz",
},
},
],
},
contractSizer: {
Expand Down
6 changes: 6 additions & 0 deletions packages/contracts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,29 +33,35 @@
"deploy:v3-engine:arbitrum:txbuilder": "yarn codegen && yarn require-low-gas arbitrum && NODE_ENV=prod EXPORT_TX_BUILDER=true yarn hardhat run --network arbitrum scripts/engine/V3/batch-create-engine-contracts.ts",
"deploy:v3-engine:base": "yarn codegen && yarn require-low-gas base && NODE_ENV=prod yarn hardhat run --network base scripts/engine/V3/batch-create-engine-contracts.ts",
"deploy:v3-engine:base:txbuilder": "yarn codegen && yarn require-low-gas base && NODE_ENV=prod EXPORT_TX_BUILDER=true yarn hardhat run --network base scripts/engine/V3/batch-create-engine-contracts.ts",
"deploy:v3-engine:shape": "yarn codegen && yarn require-low-gas shape && NODE_ENV=prod yarn hardhat run --network shape scripts/engine/V3/batch-create-engine-contracts.ts",
"deploy:v3-engine:shape:txbuilder": "yarn codegen && yarn require-low-gas shape && NODE_ENV=prod EXPORT_TX_BUILDER=true yarn hardhat run --network shape scripts/engine/V3/batch-create-engine-contracts.ts",
"post-deploy:v3-engine:dev": "yarn codegen && yarn require-low-gas sepolia && NODE_ENV=dev yarn hardhat run --network sepolia scripts/engine/V3/post-batch-create-engine-contracts.ts",
"post-deploy:v3-engine:staging": "yarn codegen && yarn require-low-gas sepolia && NODE_ENV=staging yarn hardhat run --network sepolia scripts/engine/V3/post-batch-create-engine-contracts.ts",
"post-deploy:v3-engine:mainnet": "yarn codegen && yarn require-low-gas mainnet && NODE_ENV=prod yarn hardhat run --network mainnet scripts/engine/V3/post-batch-create-engine-contracts.ts",
"post-deploy:v3-engine:arbitrum": "yarn codegen && yarn require-low-gas arbitrum && NODE_ENV=prod yarn hardhat run --network arbitrum scripts/engine/V3/post-batch-create-engine-contracts.ts",
"post-deploy:v3-engine:base": "yarn codegen && yarn require-low-gas base && NODE_ENV=prod yarn hardhat run --network base scripts/engine/V3/post-batch-create-engine-contracts.ts",
"post-deploy:v3-engine:shape": "yarn codegen && yarn require-low-gas shape && NODE_ENV=prod yarn hardhat run --network shape scripts/engine/V3/post-batch-create-engine-contracts.ts",
"deploy:shared-randomizer:goerli": "yarn require-low-gas goerli && yarn hardhat run --network goerli scripts/randomizer-deployments/shared-randomizer-deployer.ts",
"deploy:shared-randomizer:dev-sepolia": "yarn require-low-gas sepolia && NODE_ENV=dev yarn hardhat run --network sepolia scripts/randomizer-deployments/shared-randomizer-deployer.ts",
"deploy:shared-randomizer:mainnet": "yarn require-low-gas mainnet && yarn hardhat run --network mainnet scripts/randomizer-deployments/shared-randomizer-deployer.ts",
"deploy:shared-randomizer:arbitrum-goerli": "yarn require-low-gas arbitrum-goerli && yarn hardhat run --network arbitrum-goerli scripts/randomizer-deployments/shared-randomizer-deployer.ts",
"deploy:shared-randomizer:arbitrum": "yarn require-low-gas arbitrum && yarn hardhat run --network arbitrum scripts/randomizer-deployments/shared-randomizer-deployer.ts",
"deploy:shared-randomizer:base": "yarn require-low-gas base && yarn hardhat run --network base scripts/randomizer-deployments/shared-randomizer-deployer.ts",
"deploy:shared-randomizer:shape": "yarn require-low-gas shape && yarn hardhat run --network shape scripts/randomizer-deployments/shared-randomizer-deployer.ts",
"deploy:shared-minter-filter:goerli": "yarn require-low-gas goerli && yarn hardhat run --network goerli scripts/minter-filter-deployments/shared-minter-filter-deployer.ts",
"deploy:shared-minter-filter:dev-sepolia": "yarn require-low-gas sepolia && NODE_ENV=dev yarn hardhat run --network sepolia scripts/minter-filter-deployments/shared-minter-filter-deployer.ts",
"deploy:shared-minter-filter:mainnet": "yarn require-low-gas mainnet && yarn hardhat run --network mainnet scripts/minter-filter-deployments/shared-minter-filter-deployer.ts",
"deploy:shared-minter-filter:arbitrum-goerli": "yarn require-low-gas arbitrum-goerli && yarn hardhat run --network arbitrum-goerli scripts/minter-filter-deployments/shared-minter-filter-deployer.ts",
"deploy:shared-minter-filter:arbitrum": "yarn require-low-gas arbitrum && yarn hardhat run --network arbitrum scripts/minter-filter-deployments/shared-minter-filter-deployer.ts",
"deploy:shared-minter-filter:base": "yarn require-low-gas base && yarn hardhat run --network base scripts/minter-filter-deployments/shared-minter-filter-deployer.ts",
"deploy:shared-minter-filter:shape": "yarn require-low-gas shape && yarn hardhat run --network shape scripts/minter-filter-deployments/shared-minter-filter-deployer.ts",
"deploy:shared-minters:goerli": "yarn require-low-gas goerli && yarn hardhat run --network goerli scripts/minter-deployments/shared-minters-deployer.ts",
"deploy:shared-minters:sepolia": "yarn require-low-gas sepolia && yarn hardhat run --network sepolia scripts/minter-deployments/shared-minters-deployer.ts",
"deploy:shared-minters:mainnet": "yarn require-low-gas mainnet && yarn hardhat run --network mainnet scripts/minter-deployments/shared-minters-deployer.ts",
"deploy:shared-minters:arbitrum-goerli": "yarn require-low-gas arbitrum-goerli && yarn hardhat run --network arbitrum-goerli scripts/minter-deployments/shared-minters-deployer.ts",
"deploy:shared-minters:arbitrum": "yarn require-low-gas arbitrum && yarn hardhat run --network arbitrum scripts/minter-deployments/shared-minters-deployer.ts",
"deploy:shared-minters:base": "yarn require-low-gas base && yarn hardhat run --network base scripts/minter-deployments/shared-minters-deployer.ts",
"deploy:shared-minters:shape": "yarn require-low-gas shape && yarn hardhat run --network shape scripts/minter-deployments/shared-minters-deployer.ts",
"deploy:splits-factory:dev": "yarn require-low-gas sepolia && NODE_ENV=dev yarn hardhat run --network sepolia scripts/splits/splits-factory-deployer.ts",
"deploy:splits-factory:staging": "yarn require-low-gas sepolia && NODE_ENV=staging yarn hardhat run --network sepolia scripts/splits/splits-factory-deployer.ts",
"deploy:splits-factory:mainnet": "yarn require-low-gas mainnet && NODE_ENV=prod yarn hardhat run --network mainnet scripts/splits/splits-factory-deployer.ts",
Expand Down
5 changes: 5 additions & 0 deletions packages/contracts/scripts/create2-deploy/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ const CHAIN_CONFIG: Record<
network: "base",
explorer: "https://basescan.org",
},
360: {
name: "Shape",
network: "shape",
explorer: "https://shapescan.xyz",
},
11155111: {
name: "Sepolia",
network: "sepolia",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@ import { Logger } from "@ethersproject/logger";
Logger.setLogLevel(Logger.levels.ERROR);

// delay to avoid issues with reorgs and tx failures
import { delay, getAppPath, getNetworkName } from "../../../util/utils";
import {
delay,
getAppPath,
getNetworkName,
getBlockExplorerAddressUrl,
} from "../../../util/utils";
import {
getActiveCoreRegistry,
EXTRA_DELAY_BETWEEN_TX,
Expand Down Expand Up @@ -84,7 +89,6 @@ async function main() {
`deployments/engine/V3/studio/${config.environment}`
);
const outputSummaryFile = path.join(outputPath, "DEPLOYMENTS.md");
const etherscanSubdomain = networkName === "mainnet" ? "" : `${networkName}.`;
const outputMd = `
# Engine Factory Deployment

Expand All @@ -94,13 +98,13 @@ Date: ${new Date().toISOString()}

## **Environment:** ${config.environment}

**Engine Implementation:** https://${etherscanSubdomain}etherscan.io/address/${activeEngineImplementationAddress}#code
**Engine Implementation:** ${getBlockExplorerAddressUrl(networkName, activeEngineImplementationAddress)}

**Engine Flex Implementation:** https://${etherscanSubdomain}etherscan.io/address/${activeEngineFlexImplementationAddress}#code
**Engine Flex Implementation:** ${getBlockExplorerAddressUrl(networkName, activeEngineFlexImplementationAddress)}

**Engine Factory:** https://${etherscanSubdomain}etherscan.io/address/${engineFactoryAddress}#code
**Engine Factory:** ${getBlockExplorerAddressUrl(networkName, engineFactoryAddress)}

**Core Registry:** https://${etherscanSubdomain}etherscan.io/address/${coreRegistryAddress}#code
**Core Registry:** ${getBlockExplorerAddressUrl(networkName, coreRegistryAddress)}

Ownership on Core Registry transferred to the Engine Factory

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
getConfigInputs,
getNetworkName,
getChainId,
getBlockExplorerAddressUrl,
} from "../../util/utils";
import { EXTRA_DELAY_BETWEEN_TX } from "../../util/constants";
import { syncContractMetadataAfterDeploy } from "../../util/graphql-utils";
Expand Down Expand Up @@ -48,7 +49,6 @@ async function main() {
const networkName = await getNetworkName();
const chainId = await getChainId();
const outputSummaryFile = path.join(inputFileDirectory, "DEPLOYMENTS.md");
const etherscanSubdomain = networkName === "mainnet" ? "" : `${networkName}.`;

if (!deployNetworkConfiguration?.environment) {
throw new Error(
Expand Down Expand Up @@ -83,13 +83,13 @@ async function main() {

## **Environment:** ${deployNetworkConfiguration.environment}

**Engine Implementation:** https://${etherscanSubdomain}etherscan.io/address/${activeEngineImplementationAddress}#code
**Engine Implementation:** ${getBlockExplorerAddressUrl(networkName, activeEngineImplementationAddress)}

**Engine Flex Implementation:** https://${etherscanSubdomain}etherscan.io/address/${activeEngineFlexImplementationAddress}#code
**Engine Flex Implementation:** ${getBlockExplorerAddressUrl(networkName, activeEngineFlexImplementationAddress)}

**Engine Factory:** https://${etherscanSubdomain}etherscan.io/address/${engineFactoryAddress}#code
**Engine Factory:** ${getBlockExplorerAddressUrl(networkName, engineFactoryAddress)}

**Core Registry:** https://${etherscanSubdomain}etherscan.io/address/${coreRegistryAddress}#code
**Core Registry:** ${getBlockExplorerAddressUrl(networkName, coreRegistryAddress)}

---

Expand Down Expand Up @@ -224,7 +224,7 @@ async function main() {
outputMd += `
## Deployment: ${engineCoreContractType === 0 ? "Engine" : "Engine Flex"} | ${engineContractAddress}

**Engine Contract:** https://${etherscanSubdomain}etherscan.io/address/${engineContractAddress}#code
**Engine Contract:** ${getBlockExplorerAddressUrl(networkName, engineContractAddress)}

**Metadata**
- **Starting Project Id:** ${startingProjectId}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@ import { Logger } from "@ethersproject/logger";
Logger.setLogLevel(Logger.levels.ERROR);

// delay to avoid issues with reorgs and tx failures
import { delay, getConfigInputs, getNetworkName } from "../util/utils";
import {
delay,
getConfigInputs,
getNetworkName,
getBlockExplorerAddressUrl,
} from "../util/utils";
import {
DELEGATION_REGISTRY_V1_ADDRESSES,
EXTRA_DELAY_BETWEEN_TX,
Expand Down Expand Up @@ -181,8 +186,6 @@ async function main() {
//////////////////////////////////////////////////////////////////////////////

const outputSummaryFile = path.join(inputFileDirectory, "DEPLOYMENTS.md");
const etherscanSubdomain =
networkName === "mainnet" ? "" : `${networkName}.`;
const outputMd = `
# Shared Minter Deployment

Expand All @@ -196,7 +199,7 @@ Date: ${new Date().toISOString()}

**${
deployDetails.minterName
}:** https://${etherscanSubdomain}etherscan.io/address/${minterAddress}#code
}:** ${getBlockExplorerAddressUrl(networkName, minterAddress)}

**Associated Minter Filter:** ${deployDetails.minterFilterAddress}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@ import { Logger } from "@ethersproject/logger";
Logger.setLogLevel(Logger.levels.ERROR);

// delay to avoid issues with reorgs and tx failures
import { delay, getConfigInputs, getNetworkName } from "../util/utils";
import {
delay,
getConfigInputs,
getNetworkName,
getBlockExplorerAddressUrl,
} from "../util/utils";
import { EXTRA_DELAY_BETWEEN_TX } from "../util/constants";

/**
Expand Down Expand Up @@ -202,8 +207,6 @@ async function main() {
//////////////////////////////////////////////////////////////////////////////

const outputSummaryFile = path.join(inputFileDirectory, "DEPLOYMENTS.md");
const etherscanSubdomain =
networkName === "mainnet" ? "" : `${networkName}.`;
const outputMd = `
# Shared Minter Filter Deployment

Expand All @@ -217,7 +220,7 @@ Date: ${new Date().toISOString()}

**${
deployDetails.minterFilterName
}:** https://${etherscanSubdomain}etherscan.io/address/${minterFilterAddress}#code
}:** ${getBlockExplorerAddressUrl(networkName, minterFilterAddress)}

**Associated AdminACL contract:** ${adminACLContractAddress}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@ import { Logger } from "@ethersproject/logger";
Logger.setLogLevel(Logger.levels.ERROR);

// delay to avoid issues with reorgs and tx failures
import { delay, getConfigInputs, getNetworkName } from "../util/utils";
import {
delay,
getConfigInputs,
getNetworkName,
getBlockExplorerAddressUrl,
} from "../util/utils";
import { EXTRA_DELAY_BETWEEN_TX } from "../util/constants";

/**
Expand Down Expand Up @@ -155,8 +160,6 @@ async function main() {
//////////////////////////////////////////////////////////////////////////////

const outputSummaryFile = path.join(inputFileDirectory, "DEPLOYMENTS.md");
const etherscanSubdomain =
networkName === "mainnet" ? "" : `${networkName}.`;
const outputMd = `
# Shared Randomizer Deployment

Expand All @@ -170,7 +173,7 @@ Date: ${new Date().toISOString()}

**${
deployDetails.randomizerName
}:** https://${etherscanSubdomain}etherscan.io/address/${randomizerAddress}#code
}:** ${getBlockExplorerAddressUrl(networkName, randomizerAddress)}

**Associated pseudorandom atomic contract:** ${
deployDetails.pseudorandomAtomicContractAddress
Expand Down
2 changes: 1 addition & 1 deletion packages/contracts/scripts/util/aws_s3.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const {

// Docs: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/index.html

const supportedNetworks = ["mainnet", "arbitrum", "sepolia", "base"];
const supportedNetworks = ["mainnet", "arbitrum", "sepolia", "base", "shape"];

const awsCreds = {
accessKeyId: process.env.PROD_AWS_ACCESS_KEY_ID,
Expand Down
Loading
Loading