Deploy a TL Creator Contract, TRACE Contract, or BlockListRegistry from any dApp using our Universal Deployer contract factory.
Overview
As mentioned, all of our creator contracts are deployed via ERC-1167 immutable proxies. In addition, T.R.A.C.E. and BlockListRegistry contracts are also deployed in this manner.
All of this is accomplished with our Universal Deployer contract factory. We've developed this as a public good and our primary contract deployment method.
You can simply deploy contracts by encoding some initialization code and calling a single on-chain function. the CREATE2 opcode is used in order to predetermine contract addresses and deploy the same exact contract across EVM chains to the same address (pretty neat huh?).
Enjoy!
Deployed Address
The Universal Deployer is deployed to all supported chains at 0x7c24805454F7972d36BEE9D139BD93423AA29f3f
Available Contract Types
BlockListRegistry
ERC721TL
ERC1155TL
SHATTER (Shatter)
ERC7160TL
DOPPEL (Doppelganger)
CHOICE (Collectors Choice)
TRACE**
** only available on TRACE supported chains
Generating Initialization Code
Whenever you deploy with this universal deployer, you need to pass calldata as bytes for intialization code of the contract. You can encode the parameters with the function signature using many different tools, including web3py, web3js, etherjs, viem, and foundry (cast). The following example shows how to accomplish this for an ERC721TL contract with cast.
web3py
# omitted imports and creating a contract# for more, visit https://web3py.readthedocs.io/en/stable/quickstart.htmlcontract_address =""# can use any addresserc721tl_abi =''# can get from etherscancontract = web3.eth.contract(address=contract_address, abi=erc721tl_abi)init_code = contract.encodeABI( fn_name="initialize", args=["Test 721","T721","personalization","0x0000000000000000000000000000000000C0FFEE",1000,"0x0000000000000000000000000000000000C0FFEE", [],"0x0000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000" ])print(init_code)
web3js
// see more here: https://web3js.readthedocs.io/en/v1.10.0/web3-eth-contract.html#methods-mymethod-encodeabiconsole.log(contract.methods.initialize("Test 721","T721","personalization","0x0000000000000000000000000000000000C0FFEE",1000,"0x0000000000000000000000000000000000C0FFEE", [],"0x0000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000").encodeABI());
ethersjs
// see more here: https://docs.ethers.org/v5/api/utils/abi/interface/#Interface--encodingimport { ethers } from"ethers";constiFace=newethers.utils.Interface(["function initialize(string,string,string,address,uint256,address,address[],bool,address,address)"]);console.log(iFace.encodeFunctionData("initialize", ["Test 721","T721","personalization","0x0000000000000000000000000000000000C0FFEE",1000,"0x0000000000000000000000000000000000C0FFEE", [],"0x0000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000"]);
Viem
// see more here: https://viem.sh/docs/contract/encodeFunctionDataimport { parseAbi, encodeFunctionData } from'viem';constabi=parseAbi(["function initialize(string,string,string,address,uint256,address,address[],bool,address,address)"]);constinitCode=encodeFunctionData({ abi, functionName:"initialize", args: ["Test 721","T721","personalization","0x0000000000000000000000000000000000C0FFEE",BigInt(1000),"0x0000000000000000000000000000000000C0FFEE", [],"0x0000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000" ]});console.log(initCode);