Skip to content

Commit

Permalink
Have premint proxy deploy scripts. can deploy both now
Browse files Browse the repository at this point in the history
  • Loading branch information
oveddan committed Sep 28, 2023
1 parent 08875ad commit d790280
Show file tree
Hide file tree
Showing 11 changed files with 203 additions and 114 deletions.
14 changes: 7 additions & 7 deletions determinsticConfig/factoryProxy/params.json

Large diffs are not rendered by default.

22 changes: 11 additions & 11 deletions determinsticConfig/factoryProxy/signatures.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{
"1": "0x4375b61fd6efbb0c282c4c07a6126d1c171e00bae25125ade106155b1783b1d239528bd76135b9a46753680d66ebf0e4b1b4aa9252694acc861c0eb4431919a11b",
"5": "0x9a67bf6b50b88c5258aad7fd4153b71d15ad058b234fdc614bdeb3a2b8c2c0de43fec9852d167662faf86baac15f206bb3ee09a091e7cb4496b99e89b7c109061b",
"10": "0xabce4450e7b87a7463c4f58e46701d2fdb521a9a32baebeff825440cced30232473ad12d5fed7398d85b306321d2c980c38775e04725ea21d33a50ddb2c0bb451c",
"420": "0xd7131abce6e7f0de146215a724db8b7ac6ee0f9fdd5a5925c2db3bd0d7a1838b777d27632867a859990402234f26f07d1b07ed9d946b0109f5d5abf677973e381c",
"424": "0x3b982d38eab8b720ff5a9dd60f1951ef8be65a93a7df9c724a65b6540e2824bb46ce641a52f777b685f245f437c8f5a53341052038fc08b94e007a277e4cc0af1b",
"999": "0x9288092853879cb0442e97c4fe4327e86481ae046211ddc1573ff47ed72e0a211ffef04947ceee51e58662531814cef92214e3a7116cdd9f15e6a812364382181b",
"8453": "0x2e0eba56662a1143349b60d1e7be321b0b095853af329449e1f4973b637a298b3ce70f03c80195b3a9dec740e5a46961f98aeb0cbde860ab1b140eaeabbeb8591c",
"58008": "0x1ff3a0a7d1cf68093dd6eaffcaa89f03870d791a69dbcb10799fe45673452a98206589bcfcaf289db3f0e2f2b107f4d5275b8bbe2096c25ed9e09e28f992cd9a1b",
"84531": "0xf44ffda048e8dbe8f8f3555bd711754cc3eaabd6c046b3a4ae062f849a123b156bf60bd23c6ff3b35b255d836d4d4ad4abc71f8788384a5f7c8f7592a35bde5f1b",
"7777777": "0xa2cf3759a9834cad456f1655e55487f77cd9ebf98bfe1efce47dc28861f705661954f7761d5165cf784c90aec6406574c6e7de3d5335bd40c363aedfc111aa8b1b",
"11155111": "0x715be9fdf91d580e9e6591f9ce5b06ab3212c0d789542fa75283dd93aa92c9fb280cf164226daea382261c10a000f1a2ae5bb3147626920befb354b18f4cc9b91c"
"1": "0x2933443bc97517731893d612ce5d51bc980b9185efce2826e58721fa59ad517123e72be886717639b75eb30380f8b0feee3b36c94c4bb31b2e99ad3b1f0e1bd81c",
"5": "0xaef23e2b095dcdd758e3c57f75e3b96245ec5f4339175946aa2abd829f8f389935e365987c1dfe3ef3fbf12ff30810351cbc3af6e7f225abfee9d8d11d15abb51b",
"10": "0x7bceed3c7695faaed17d15c52f9153b5faa94b8144d8517437d334578a41f98269d78cfefe0b4869c3c5098cc495f9ea4e8b8f4a530e6d8f28c7bf35c52ea7971b",
"420": "0x303b4c1d43bdaf0985e82f97e31ed69af5b00f979d6b2d9bbf4ad41f16ba525e319198f63ebc6aeff44f70bc12b04578d12fd39e2b830e47d6477f9b5eae9d8d1b",
"424": "0x1cf2cfb0a1bbfee57ad8e72e5e6c81262c6892e3726350bcf069d035c74e70f57dcbe7dfba5ab64c7e440fb5faacd31a798e453094c3de34a6ebb26db644acce1b",
"999": "0x16546150074572fa72cf1e66b635b196c02e4cc95f0d465dbfe5cf09a452fe6b4b748990ed760be3b1620b6df53787baac3bc3f1755ebcc228690ff5b7744de81c",
"8453": "0xda5c219fab6e1be7ad156d002cca90af281dd17a003a9719c76e99ac34568bb62b726d72d025b852dddaae26d26dc1a2508b24a803e7338615df532b49b8d0ed1c",
"58008": "0x00bbddd17272d09cdc81521daa09101777017ed1662077a46215b4bc9136622c1574d5768b95310d7fe5fff9d1803653dbb70dba5fdcf1a442af9893431f64dc1b",
"84531": "0x2bd795e9c7dc06c52d52626d5ce93b8ab5dab38c64dd2527d3d07be053c5d2f679648c00c302bc684abbae1b517eaf4435edf1873d74ecbd12d2c160fa8001ec1c",
"7777777": "0x0d33c46e997d3487f08bc153c5d6dac7dbff21057bd2d6ec857e7140f51879ce73e2fb23ae705c2d1bd1316caaaf5f8258ad404a595cafd3a28a622d0dba18b51b",
"11155111": "0x3e09018c6aa6ef37fdade862ef28d9799debd800552a80a0748adaa967d20a095463dbdcaeecf61a6fd9aa2514b24d01947bbb05c8ca7a5383e00da47d52fd941c"
}

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions determinsticConfig/premintExecutorProxy/signatures.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"999": "0x18ec8191bac7a5d1751104f4ef1b817df5b307c9ce0d4ea68af4fc00a429cf8c30483b3cb0278e8cf28a9c1af97f9a9f59bb05863aeb5adc0b7897e604afec931c"
}
12 changes: 6 additions & 6 deletions package/deployment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ export type DeployedContracts = {
export const signDeployFactory = ({
account,
determinsticDeploymentConfig: config,
factoryImplAddress,
factoryOwner,
implementationAddress,
owner,
chainId,
}: {
account: LocalAccount;
determinsticDeploymentConfig: DeterminsticDeploymentConfig;
factoryImplAddress: Address;
factoryOwner: Address;
implementationAddress: Address;
owner: Address;
chainId: number;
}) =>
account.signTypedData({
Expand All @@ -38,10 +38,10 @@ export const signDeployFactory = ({
},
message: {
proxyShimSalt: config.proxyShimSalt,
implementationAddress: factoryImplAddress,
implementationAddress,
proxyCreationCode: config.proxyCreationCode,
proxySalt: config.proxySalt,
owner: factoryOwner,
owner: owner,
},
primaryType: "createProxy",
domain: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,9 @@ import {ZoraDeployerUtils} from "../src/deployment/ZoraDeployerUtils.sol";
import {NewFactoryProxyDeployer} from "../src/deployment/NewFactoryProxyDeployer.sol";
import {DeterminsticDeployerScript, DeterminsticParams} from "../src/deployment/DeterminsticDeployerScript.sol";

contract DeployNewFactoryProxy is ZoraDeployerBase, DeterminsticDeployerScript {
contract DeployNewProxies is ZoraDeployerBase, DeterminsticDeployerScript {
using stdJson for string;

error MismatchedAddress(address expected, address actual);

function run() public returns (string memory) {
uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PRIVATE_KEY");
// address deployer = vm.envAddress("DEPLOYER");
Expand All @@ -25,33 +23,26 @@ contract DeployNewFactoryProxy is ZoraDeployerBase, DeterminsticDeployerScript {
Deployment memory deployment = getDeployment();

// get signing instructions

(DeterminsticParams memory params, bytes memory signature) = readDeterminsticParams("factoryProxy", chain);

vm.startBroadcast(deployerPrivateKey);

NewFactoryProxyDeployer factoryDeployer = NewFactoryProxyDeployer(
ZoraDeployerUtils.IMMUTABLE_CREATE2_FACTORY.safeCreate2(params.proxyDeployerSalt, params.proxyDeployerCreationCode)
);

console2.log(address(factoryDeployer));
console2.log(params.proxyDeployerAddress);

if (address(factoryDeployer) != params.proxyDeployerAddress) revert MismatchedAddress(params.proxyDeployerAddress, address(factoryDeployer));
address factoryProxyAddress = deployDeterminsticProxy({
proxyName: "factoryProxy",
implementation: deployment.factoryImpl,
owner: chainConfig.factoryOwner,
chain: chain
});

address factoryProxyAddress = factoryDeployer.createFactoryProxyDeterminstic(
params.proxyShimSalt,
params.proxySalt,
params.proxyCreationCode,
params.determinsticProxyAddress,
deployment.factoryImpl,
chainConfig.factoryOwner,
signature
);
address preminterProxyAddress = deployDeterminsticProxy({
proxyName: "premintExecutorProxy",
implementation: deployment.preminterImpl,
owner: chainConfig.factoryOwner,
chain: chain
});

vm.stopBroadcast();

deployment.factoryProxy = factoryProxyAddress;
deployment.preminterProxy = preminterProxyAddress;

return getDeploymentJSON(deployment);
}
Expand Down
2 changes: 1 addition & 1 deletion script/FactoryProxyDeterminsticParams.sol
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ contract FactoryProxyDeterminsticParams is ZoraDeployerBase, DeterminsticDeploye

bytes memory proxyCreationCode = type(Zora1155Factory).creationCode;

determinsticParams = getDeterminsticDeploymentParams(deployerAddress, proxyCreationCode);
determinsticParams = getDeterminsticDeploymentParams(deployerAddress, proxyCreationCode, 100);

serializeAndSaveOutput(determinsticParams, "factoryProxy");
}
Expand Down
4 changes: 2 additions & 2 deletions script/PremintProxyDeterminsticParams.sol
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ contract PremintProxyDeterminsticParams is ZoraDeployerBase, DeterminsticDeploye

bytes memory proxyCreationCode = type(Zora1155PremintExecutor).creationCode;

determinsticParams = getDeterminsticDeploymentParams(deployerAddress, proxyCreationCode);
determinsticParams = getDeterminsticDeploymentParams(deployerAddress, proxyCreationCode, 200);

serializeAndSaveOutput(determinsticParams, "premintExecutor");
serializeAndSaveOutput(determinsticParams, "premintExecutorProxy");
}
}
162 changes: 110 additions & 52 deletions script/signDeploymentTransactions.ts
Original file line number Diff line number Diff line change
@@ -1,57 +1,81 @@
import { createAccount } from "@turnkey/viem";
import { TurnkeyClient } from "@turnkey/http";
import { Address } from "viem";
import { Address, LocalAccount } from "viem";
import { ApiKeyStamper } from "@turnkey/api-key-stamper";
// import { getDeployFactoryProxyDeterminsticTx } from '../package/deployment';
// import { testConfig } from "../package/deploymentConfig";
import deployConfig from '../determinsticConfig/factoryProxy/params.json';
import factoryProxyDeployConfig from '../determinsticConfig/factoryProxy/params.json';
import { glob } from "glob";
import * as path from "path";
import * as dotenv from "dotenv";
import { promisify } from 'util';
import { writeFile } from 'fs';
import { writeFile, readFile } from 'fs';
import { ConfiguredSalt, DeterminsticDeploymentConfig, signDeployFactory } from "../package/deployment";
import { fileURLToPath } from 'url';
import { dirname } from 'path';
import { config } from "process";

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

const writeFileAsync = promisify(writeFile);
const readFileAsync = promisify(readFile);

// Load environment variables from `.env.local`
dotenv.config({ path: path.resolve(__dirname, "../.env") });

async function main() {
// Create a Turnkey HTTP client with API key credentials
const httpClient = new TurnkeyClient(
{
baseUrl: "https://api.turnkey.com",
},
// This uses API key credentials.
// If you're using passkeys, use `@turnkey/webauthn-stamper` to collect webauthn signatures:
// new WebauthnStamper({...options...})
new ApiKeyStamper({
apiPublicKey: process.env.API_PUBLIC_KEY!,
apiPrivateKey: process.env.API_PRIVATE_KEY!,
})
);
type ChainConfig = {
chainId: number,
implementationAddress: Address,
owner: Address
};

async function signAndSaveSignatures({
turnkeyAccount,
chainConfigs,
proxyName
}: {
turnkeyAccount: LocalAccount,
chainConfigs: ChainConfig[],
proxyName: "factoryProxy" | "premintExecutorProxy"
}) {
const configFolder = path.resolve(__dirname, `../determinsticConfig/${proxyName}/`);
const configFile = path.join(configFolder, 'params.json');
const determinsticDeployConfig = JSON.parse(await readFileAsync(configFile, 'utf-8'));

// Create the Viem custom account
const turnkeyAccount = await createAccount({
client: httpClient,
organizationId: "f7e5bec5-b7f9-486a-a8c3-cd1ec7362709",
privateKeyId: "3e3c5029-7ad7-4559-936f-93d21763143b",
// optional; will be fetched from Turnkey if not provided
ethereumAddress: "0x4F9991C82C76aE04CC39f23aB909AA919886ba12"
});
const deploymentConfig: DeterminsticDeploymentConfig = {
proxyDeployerAddress: determinsticDeployConfig.proxyDeployerAddress as Address,
proxySalt: determinsticDeployConfig.proxySalt as ConfiguredSalt,
proxyShimSalt: determinsticDeployConfig.proxyShimSalt as ConfiguredSalt,
proxyCreationCode: determinsticDeployConfig.proxyCreationCode as Address
}

const signedConfigs = await Promise.all(chainConfigs.map(async chainConfig => {
return {
chainId: chainConfig.chainId,
signature: await signDeployFactory({
account: turnkeyAccount,
implementationAddress: chainConfig.implementationAddress,
owner: chainConfig.owner,
chainId: chainConfig.chainId,
determinsticDeploymentConfig: deploymentConfig
}),
}
}));

// aggregate above to object of key value pair indexed by chain id as number:
const byChainId = signedConfigs.reduce((acc, { chainId, signature }) => {
acc[chainId] = signature;
return acc;
}, {} as { [key: number]: string } );

// write as json to ../determinsticConfig/factoryDeploySignatures.json:
await writeFileAsync(path.join(configFolder, "signatures.json"), JSON.stringify(byChainId, null, 2));
}

const getFactoryImplConfigs = async () => {
const addresseFiles = await glob(
path.resolve(__dirname, "../addresses/*.json")
);

console.log(path.resolve(__dirname, "../addresses/*.json"));

const chainConfigs = await Promise.all(addresseFiles.map(async addressConfigFile => {
const chainId = parseInt(path.basename(addressConfigFile).split(".")[0]);

Expand All @@ -63,40 +87,74 @@ async function main() {

return {
chainId,
factoryImpl: fileContents['FACTORY_IMPL'] as Address,
implementationAddress: fileContents['FACTORY_IMPL'] as Address,
owner: chainConfig['FACTORY_OWNER'] as Address
}
}));

const deploymentConfig: DeterminsticDeploymentConfig = {
proxyDeployerAddress: deployConfig.proxyDeployerAddress as Address,
proxySalt: deployConfig.proxySalt as ConfiguredSalt,
proxyShimSalt: deployConfig.proxyShimSalt as ConfiguredSalt,
proxyCreationCode: deployConfig.proxyCreationCode as Address
}
return chainConfigs;
}

const getPreminterImplConfigs = async () => {
const addresseFiles = await glob(
path.resolve(__dirname, "../addresses/*.json")
);

const chainConfigs = await Promise.all(addresseFiles.map(async addressConfigFile => {
const chainId = parseInt(path.basename(addressConfigFile).split(".")[0]);

// read file and process JSON contents:
const fileContents = await import(addressConfigFile);

// read chain config file as json, which is located at: ../chainConfigs/${chainId}.json:
const chainConfig = await import(path.resolve(__dirname, `../chainConfigs/${chainId}.json`));

const signedConfigs = await Promise.all(chainConfigs.map(async chainConfig => {
return {
chainId: chainConfig.chainId,
signature: await signDeployFactory({
account: turnkeyAccount,
factoryImplAddress: chainConfig.factoryImpl,
factoryOwner: chainConfig.owner,
chainId: chainConfig.chainId,
determinsticDeploymentConfig: deploymentConfig
}),
chainId,
implementationAddress: fileContents['PREMINTER_IMPL'] as Address,
owner: chainConfig['FACTORY_OWNER'] as Address
}
}));


// aggregate above to object of key value pair indexed by chain id as number:
const byChainId = signedConfigs.reduce((acc, { chainId, signature }) => {
acc[chainId] = signature;
return acc;
}, {} as { [key: number]: string } );

// write as json to ../determinsticConfig/factoryDeploySignatures.json:
await writeFileAsync(path.resolve(__dirname, "../determinsticConfig/factoryProxy/signatures.json"), JSON.stringify(byChainId, null, 2));
return chainConfigs.filter(x => x.implementationAddress !== undefined);
}

async function main() {
// Create a Turnkey HTTP client with API key credentials
const httpClient = new TurnkeyClient(
{
baseUrl: "https://api.turnkey.com",
},
// This uses API key credentials.
// If you're using passkeys, use `@turnkey/webauthn-stamper` to collect webauthn signatures:
new ApiKeyStamper({
apiPublicKey: process.env.API_PUBLIC_KEY!,
apiPrivateKey: process.env.API_PRIVATE_KEY!,
})
);

// Create the Viem custom account
const turnkeyAccount = await createAccount({
client: httpClient,
organizationId: "f7e5bec5-b7f9-486a-a8c3-cd1ec7362709",
privateKeyId: "3e3c5029-7ad7-4559-936f-93d21763143b",
// optional; will be fetched from Turnkey if not provided
ethereumAddress: "0x4F9991C82C76aE04CC39f23aB909AA919886ba12"
});

await signAndSaveSignatures({
turnkeyAccount,
chainConfigs: await getFactoryImplConfigs(),
proxyName: "factoryProxy"
});

await signAndSaveSignatures({
turnkeyAccount,
chainConfigs: await getPreminterImplConfigs(),
proxyName: "premintExecutorProxy"
});
}

main().catch((error) => {
Expand Down
Loading

0 comments on commit d790280

Please sign in to comment.