Deploying 0x on the Matic testnet
Matic Network is a sidechain based scaling solution for public blockchains. It is based on an adapted implementation of Plasma framework. Matic provides scalability while ensuring a superior user experience in a secured and decentralized manner.
0x is an open protocol that facilitates trustless, low friction exchange of Ethereum-based assets.
This guide will take you through:
- Deploying 0x contracts on Matic testnet
- Starting an exchange on Matic testnet using 0x-launch-kit
Pre-requisite
You need system-wide installations of
- Python 3
- Node.js 8+
- Yarn 1.9.4+
Deploy contracts
Clone the 0x-monorepo and install node dependencies
$ git clone https://github.com/0xProject/0x-monorepo.git
$ cd 0x-monorepo/
$ yarn install
Because our Matic testnet provider doesn’t return any addresses on eth_accounts
call, we will need to make this small change to enable migration
package deploying the contracts:
- Open
packages/migrations/src/migration.ts
file - Find the line
const accounts: string[] = await web3Wrapper.getAvailableAddressesAsync();
- Replace it with
const accounts: string[] = ['0x56F65dCD821c660b4f3E833696747F5D8e3C537B', '0x685A01B16909eC890B548D9DFf6E7ABF4ec0A24e'];
- Feel free to change these two addresses with yours, they will be use as owners of
AssetProxyOwnerContract
.
Build migrations
package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
$ PKG=@0x/migrations yarn build
Deploy the contracts to Matic testnet
$ packages/migrations/bin/0x-migrate.js --rpc-url 'https://testnet2.matic.network' --from $DeployAddress --pk $PrivatekeyForDeployAddress
After few seconds (Matic testnet is really fast!) we should see our deployed contract addresses
You can place these addresses to the explorer URL, like this, to make sure the contracts is correctly deployed on Matic.
Open packages/contract-addresses/src/index.ts
, append Matic
to network id list and put our addresses above to networkToAddresses
(view file)
...
export enum NetworkId {
Mainnet = 1,
Ropsten = 3,
Rinkeby = 4,
Kovan = 42,
Ganache = 50,
Matic = 8995,
}
...
const networkToAddresses: { [networkId: number]: ContractAddresses } = {
...
8995: {
exchange: '0xd30d3d36daa6da31d481c19eaccd94558c1aa594',
erc20Proxy: '0x0a53e142138c0d68f5cf968cc74c6f633df57f6b',
erc721Proxy: '0x8fb632da59e73450e097847c0c75608f79770182',
erc1155Proxy: '0xcc270ac66fdde50ea78c6e6a4a334739a2e3f59d',
forwarder: '0x51eb0db2c4a7bcfe18f83f3bdbfaec604056cb03',
orderValidator: '0x0a999c924736b8ec96f01fc959365ebd999a8dab',
zrxToken: '0xb1b57aca0977fdc772bda3ee292b189f363bcea0',
etherToken: '0xbf4263c8842b48c2f7cb1ceb237ae0207952edab',
assetProxyOwner: '0x1f02042d523d9d8b5eafe6eb6d2945b1cf14dd2d',
dutchAuction: '0xc06123a6a87f9866cd74952d3436a78a37a3a46b',
coordinatorRegistry: '0x9ab4d2039e07d08178fac0964cf967f3bd2e25e7',
coordinator: '0xa100ac285e42e62b8d802428d715963f18932aab',
multiAssetProxy: '0x3cf1c836071578a1e900236abf9d2ef0c966c53a',
staticCallProxy: '0x66dafa927c0b36954b67508ad2ee065ac1715024',
devUtils: '0x944131374d60fbdc8d99a05cfd42bb23d33142d9',
},
};
...
Build contract-addresses
package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
$ PKG=@0x/contract-addresses yarn build
Run 0x-launch-kit-backend
Clone the 0x-launch-kit-backend in the same parent directory with 0x-monorepo. Don’t install the dependencies yet!
$ git clone https://github.com/0xProject/0x-launch-kit-backend.git
$ cd 0x-launch-kit-backend/
Open yarn.lock
file and replace all line "@0x/contract-addresses" "^3.0.1"
with "@0x/contract-addresses" "file:../0x-monorepo/packages/contract-addresses"
. I know that’s pretty tricky but i think it’s the easiest way to use our contract-addresses
package.
Now install the dependencies with –frozen-lockfile flag
$ yarn install --frozen-lockfile
We will use the Typescript code base
- Delete the js directory
- Delete all scripts from package.json that end with :js
Open ts/src/config.ts
file, edit WHITELISTED_TOKENS with ZRX and WETH tokens you deployed:
export const WHITELISTED_TOKENS: string[] | '*' = _.isEmpty(process.env.WHITELIST_ALL_TOKENS)
? [
'0xb1b57aca0977fdc772bda3ee292b189f363bcea0', // ZRX on Matic
'0xbf4263c8842b48c2f7cb1ceb237ae0207952edab', // WETH on Matic
]
: assertEnvVarType('WHITELIST_ALL_TOKENS', process.env.WHITELIST_ALL_TOKENS, EnvVarType.WhitelistAllTokens);
Open .env
and paste this content
NETWORK_ID=8995
RPC_URL=https://testnet2.matic.network
Build the project and start the relayer
$ yarn build:ts
$ yarn start:ts
To quickly check if your relayer is up-and-running, send it this CURL request from other terminal:
$ curl http://localhost:3000/v2/orders
{"total":0,"page":1,"perPage":20,"records":[]}
Run 0x-launch-kit-frontend
Clone the 0x-launch-kit-frontend in the same parent directory with 0x-monorepo and 0x-launch-kit-backend.
$ git clone https://github.com/0xProject/0x-launch-kit-frontend.git
$ cd 0x-launch-kit-frontend/
Similar to the backend, open yarn.lock
file and replace all line "@0x/contract-addresses" "^3.0.1"
with "@0x/contract-addresses" "file:../0x-monorepo/packages/contract-addresses"
, then install the dependencies with –frozen-lockfile flag
$ yarn install --frozen-lockfile
Open src/common/constants.ts
file, change the DEFAULT_GAS_PRICE to zero
export const DEFAULT_GAS_PRICE = new BigNumber(0);
Open src/util/types.ts
file, add matic
to network enum
export enum Network {
Mainnet = 1,
Rinkeby = 4,
Kovan = 42,
Ganache = 50,
Matic = 8995,
}
Update src/config.json
with our addresses
{
"general": {
"title": "Launch Kit"
},
"tokens": [
{
"symbol": "zrx",
"name": "0x Protocol Token",
"primaryColor": "#333333",
"icon": "assets/icons/zrx.svg",
"addresses": {
"1": "0xE41d2489571d322189246DaFA5ebDe1F4699F498",
"3": "0xff67881f8d12f372d91baae9752eb3631ff0ed00",
"4": "0x8080c7e4b81ecf23aa6f877cfbfd9b0c228c6ffa",
"42": "0x2002d3812f58e35f0ea1ffbf80a75a38c32175fa",
"50": "0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c",
"8995": "0xb1b57aca0977fdc772bda3ee292b189f363bcea0"
},
"decimals": 18,
"displayDecimals": 2
},
{
"symbol": "weth",
"name": "Wrapped Ether",
"primaryColor": "#3333ff",
"icon": "assets/icons/weth.svg",
"addresses": {
"1": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"3": "0xc778417e063141139fce010982780140aa0cd5ab",
"4": "0xc778417e063141139fce010982780140aa0cd5ab",
"42": "0xd0a1e359811322d97991e03f863a0c30c2cf029c",
"50": "0x0b1ba0af832d7c05fd64161e0db78e85978e8082",
"8995": "0xbf4263c8842b48c2f7cb1ceb237ae0207952edab"
},
"decimals": 18,
"displayDecimals": 2
}
],
"pairs": [
{
"base": "zrx",
"quote": "weth"
}
],
"marketFilters": [
{
"text": "ETH",
"value": "weth"
}
]
}
Start the frontend using our above relayer (restart the backend if you stopped it)
$ REACT_APP_NETWORK_ID='8995' REACT_APP_RELAYER_URL='http://localhost:3000/v2' yarn start
Go to http://localhost:3001/#/erc20, don’t forget installing Metamask and configuring it to Matic testnet. Follow the official document for more details.
Appendix: Deploy 0x version 1
To deploy the version 1 contracts, checkout the v1-protocol
branch of 0x-monorepo
$ cd 0x-monorepo/
$ git checkout v1-protocol
$ yarn install
Install truffle-hdwallet-provider
, i tried to use PrivateKeyWalletSubprovider
from @0xproject/subproviders
but didn’t succeed
$ yarn add truffle-hdwallet-provider
Replace packages/migrations/src/migrate.ts
file with this content
#!/usr/bin/env node
import { logUtils } from '@0xproject/utils';
import HDWalletProvider = require('truffle-hdwallet-provider');
import { runMigrationsAsync } from './migration';
(async () => {
const sender = '0x913dA4198E6bE1D5f5E4a40D0667f70C0B5430Eb';
const senderPk = 'fae42052f82bed612a724fec3632f325f377120592c75bb78adfcceae6470c5a';
const provider = new HDWalletProvider(senderPk, 'https://testnet2.matic.network');
const txDefaults = { from: sender.toLowerCase() };
const artifactsDir = 'artifacts/1.0.0';
await runMigrationsAsync(provider, artifactsDir, txDefaults);
process.exit(0);
})().catch(err => {
logUtils.log(err);
process.exit(1);
});
You may change the sender
and senderPk
with your address and private key
Update packages/migrations/src/migration.ts
file
- Find the line
const accounts: string[] = await web3Wrapper.getAvailableAddressesAsync();
- Replace it with
const accounts: string[] = ['0x913dA4198E6bE1D5f5E4a40D0667f70C0B5430Eb', '0x685A01B16909eC890B548D9DFf6E7ABF4ec0A24e'];
- Feel free to change these two addresses with yours, make sure the first address is your
sender
above.
Build migrations
package, run the following from the monorepo root directory, notice that the command is a bit different from version 2
$ PKG=@0xproject/migrations yarn build
Deploy the contracts to Matic testnet
$ cd packages/migrations/
$ yarn migrate
The script prints out our deployed contracts and updates the addresses in packages/migrations/artifacts/1.0.0/
folder
Thanks for reading and I do hope you found this article somewhat helpful.