High Level Flow
Depositing Ether -
- Make depositEtherFor call on RootChainManager and send the required ether.
Withdrawing Ether -
- Burn tokens on matic chain.
- Call exit function on RootChainManager to submit proof of burn transaction. This call can be made after checkpoint is submitted for the block containing burn transaction.
Instantiate the contracts
Call the depositEtherFor function of RootChainManager contract. This function takes 1 argument, user. user is the address of user that will receive the deposit on matic chain. The amount of ether to be deposit has to be sent as value of transaction.
Since Ether is an ERC20 token on matic chain, its withdraw process is same as ERC20 withdraw. Tokens can be burned by calling the withdraw function on child token contract. This function takes a single argument, amount indicating the number of tokens to be burned. Proof of this burn needs to be submitted in the exit step. So store the transaction hash.
Exit function on RootChainManager contract has to be called to unlock and receive the tokens back from EtherPredicate. This function takes a single bytes argument that proves the burn transaction. Wait for the checkpoint containing burn tenasaction to be submitted before calling this function. The Proof is generated by RLP ecoding following fields -
- headerNumber - Checkpoint header block number containing the burn tx
- blockProof - Proof that the block header (in the child chain) is a leaf in the submitted merkle root
- blockNumber - Block number containing the burn tx on child chain
- blockTime - Burn tx block time
- txRoot - Transactions root of block
- receiptRoot - Receipts root of block
- receipt - Receipt of the burn transaction
- receiptProof - Merkle proof of the burn receipt
- branchMask - 32 bits denoting the path of receipt in merkle patricia tree
- receiptLogIndex - Log Index to read from the receipt
Generating proof manually can be tricky so it is advisable to use the matic SDK. If you want to send the transaction manually, you can pass encodeAbi as true in the options object to get raw calldata.
Send this calldata to RootChainManager.