7. Migrate the contracts into an Ethereum network¶
This article is part of the beginner tutorial on creating a totally decentralized Bitcoin price feed on Ethereum with Solidity and Witnet.
Compile your Solidity contract¶
First off, run the compile
command, which compiles your Solidity
contracts and then recompiles the Witnet requests:
npm run compile
yarn compile
You have migration scripts by default!¶
Migration scripts are very useful in Truffle. They allow you to configure how your contracts will be deployed on different Ethereum networks, set your contract's constructor arguments and link dynamic dependencies.
In addition to compiling your requests into Solidity, the Witnet request compiler that lives inside the Truffle box also
wrote autogenerated migration scripts for your
contracts. If you look at the migrations
folder, you should find
these three files:
1_initial_migration.js
: basic Truffle infrastructure migrations.2_witnet_core.js
: deploys all the Witnet-related contracts if you are deploying on a local or private network; or dynamically links them if you are on a public network (Ethereum Mainnet, Rinkeby or Görli).3_user_contracts.js
: contains autogenerated migration scripts for your consumer contracts.
Let's take a look at migrations/3_user_contracts.js
:
// This file was auto-generated by the Witnet compiler; any manual changes will be overwritten except
// for the contracts' constructor arguments (you can freely edit those and the compiler will respect them).
const Witnet = artifacts.require("Witnet")
const WitnetRequestsBoardProxy = artifacts.require("WitnetRequestsBoardProxy")
const PriceFeed = artifacts.require("PriceFeed")
module.exports = function (deployer) {
deployer.link(Witnet, [PriceFeed])
deployer.deploy(PriceFeed, WitnetRequestsBoardProxy.address)
}
As you can see, the autogenerated migration script is:
- Dynamically linking the
Witnet
library to yourPriceFeed
contract. - Deploying your
PriceFeed
contract. - Passing the address of the Witnet Bridge Interface to the
PriceFeed
constructor.
For the compiler to pass the address of the Witnet Bridge Interface to
all your consumer contracts, it is important that they have a
constructor argument called _wbi
, just like PriceFeed
has.
Customize the constructor arguments¶
If your consumer contract has additional constructor arguments, the compiler will create default values for them.
Before running any migration, please make sure you double-check the default arguments that the compiler inserts for you, as they may not make any sense for your specific use case.
Once you modify any constructor arguments, the compiler will not rewrite
those lines. If you mess them up or you want the compiler to generate
default values for new constructor arguments, you can just delete those
lines or remove the 3_user_contracts.js
file altogether, then run the
compiler once again.
Run the deployment¶
Deploying your contract into Truffle's own local Ethereum network is as simple as executing:
truffle migrate
Please take into account that Truffle's own local network lacks any bridging capability with Witnet. This means that it is good for testing the migrations, but not for testing the entire workflow of your contracts. However, the Witnet community is working hard to overcome this limitation so that you can test your Witnet-connected contracts locally.
If you want to test your contracts in a more realistic environment, you
can deploy them into a public network using the --network
flag:
truffle migrate --network=rinkeby
deploys on the Ethereum Rinkeby testnet.truffle migrate --network=goerli
deploys on the Ethereum Görli testnet.
Deploying on Mainnet is not supported yet. Take a look at the community roadmap for more information on Mainnet support.
Interact with your contract¶
The Truffle documentation has a comprehensive guide on interacting with your contracts.