Matic SDK
This repository contains the maticjs
client library. maticjs
makes it easy for developers, who may not be deeply familiar with smart contract development, to interact with the various components of Matic Network.
This library will help developers to move assets from Ethereum chain to Matic chain, and withdraw from Matic to Ethereum using fraud proofs.
We will be improving this library to make all features available like Plasma Faster Exit, challenge exit, finalize exit and more.
Installation
NPM
$ npm install --save @maticnetwork/maticjs
CDN
<script src="https://cdn.jsdelivr.net/npm/@maticnetwork/maticjs@2.0.0/dist/matic.js"></script>
Matic is also available on unpkg
Getting started
import Matic from '@maticnetwork/maticjs'
const network = new Network(
_network,
_version
)
const matic = new Matic({
network: <network-name>,
version: <network-version>
maticProvider: <web3-provider>,
parentProvider: <web3-provider>,
parentDefaultOptions: { <options> },
maticDefaultOptions: { <options> },
})
matic.initialize()
await matic.balanceOfERC20(
user,
tokenAddress,
options
)
await matic.balanceOfERC721(
user,
tokenAddress,
options
)
await matic.tokenOfOwnerByIndexERC721(
from,
tokenAddress,
index,
options
)
await matic.depositEther(
amount,
options
)
await matic.approveERC20TokensForDeposit(
token,
amount,
options
)
await matic.depositERC20ForUser(
token,
user,
amount,
options
)
await matic.safeDepositERC721Tokens(
token,
tokenId,
options
)
await matic.transferERC20Tokens(
token,
user,
amount,
options
)
await matic.transferERC721Tokens(
token,
user,
tokenId,
options
)
await matic.getTransferSignature(
toSell,
toBuy,
options
)
await matic.transferWithSignature(
sig,
toSell,
toBuy,
orderFiller,
options
)
await matic.startWithdraw(
token,
amount,
options
)
await matic.startWithdrawForNFT(
token,
tokenId,
options
)
await matic.withdraw(
txId,
options
)
await matic.withdrawNFT(
txId,
options
)
await matic.processExits(
tokenAddress,
options
)
import MaticPOSClient from '@maticnetwork/maticjs'
const maticPOSClient = new MaticPOSClient({
maticProvider: <web3-provider>,
parentProvider: <web3-provider>,
rootChain: <root-contract-address>,
posRootChainManager: <pos-root-chain-manager-address>,
})
await maticPOSClient.approveERC20ForDeposit(
rootToken,
amount,
options
)
await maticPOSClient.depositERC20ForUser(
rootToken,
user,
amount,
options
)
await maticPOSClient.depositEtherForUser(
user,
amount,
options
)
await maticPOSClient.burnERC20(
childToken,
amount,
options
)
await maticPOSClient.exitERC20(
txId,
options
)
How it works?
The flow for asset transfers on the Matic Network is as follows:
- User deposits crypto assets in Matic contract on mainchain
- Once deposited tokens get confirmed on the main chain, the corresponding tokens will get reflected on the Matic chain.
- The user can now transfer tokens to anyone they want instantly with negligible fees. Matic chain has faster blocks (approximately ~ 1 second). That way, the transfer will be done almost instantly.
- Once a user is ready, they can withdraw remaining tokens from the mainchain by establishing proof of remaining tokens on Root contract (contract deployed on Ethereum chain)
Network and version
-
Network is network name you want to use e.g mainnet or testnet
-
version is network verstion e.g v1, v2, mumbai
Contracts and addresses
You don't have to worry about contract addresses, giving correct network name and version will pickup respective addresses :grinning:
Faucet
https://faucet.matic.network
API
WithdrawManager
POS Portal
new Matic(options)
Creates Matic SDK instance with give options. It returns a MaticSDK object.
import Matic from 'maticjs'
const matic = new Matic(options)
matic.initialize()
options
is simple Javascript object
which can have following fields:
network
can be string
version
can be string
maticProvider
can be string
or Web3.providers
instance. This provider must connect to Matic chain. Value can be anyone of following:
parentProvider
can be string
or Web3.providers
instance. This provider must connect to Ethereum chain (testnet or mainchain). Value can be anyone of following:
parentDefaultOptions
is simple Javascript object
with following options
from
must be valid account address(required)
maticDefaultOptions
is simple Javascript object
with following options
from
must be valid account address(required)
matic.balanceOfERC20(userAddress, token, options)
get balance of ERC20 token
for address
.
token
must be valid token addressuserAddress
must be valid user addressoptions
see more infomation here
parent
must be boolean value. For balance on Main chain, use parent: true
This returns balance
.
Example:
matic
.balanceOfERC20('0xABc578455...', '0x5E9c4ccB05...', {
from: '0xABc578455...',
})
.then(balance => {
console.log('balance', balance)
})
matic.balanceOfERC721(userAddress, token, options)
get balance of ERC721 token
for address
.
token
must be valid token addressuserAddress
must be valid user addressoptions
see more infomation here
parent
must be boolean value. For balance on Main chain, use parent: true
This returns balance
.
Example:
matic
.balanceOfERC721('0xABc578455...', '0x5E9c4ccB05...', {
from: '0xABc578455...',
})
.then(balance => {
console.log('balance', balance)
})
matic.tokenOfOwnerByIndexERC721(userAddress, token, index, options)
get ERC721 tokenId at index
for token
and for address
.
token
must be valid token addressuserAddress
must be valid user addressindex
index of tokenId
This returns matic tokenId
.
Example:
matic
.tokenOfOwnerByIndexERC721('0xfeb14b...', '21', 0, {
from: '0xABc578455...',
})
.then(tokenID => {
console.log('Token ID', tokenID)
})
matic.depositEthers(amount, options)
Deposit options.value
amount
must be token amount in wei (string, not in Number)options
see more infomation here.
from
must be valid account address(required)encodeAbi
must be boolean value. For Byte code of transaction, use encodeAbi: true
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
matic.depositEthers(amount, {
from: '0xABc578455...',
})
matic.approveERC20TokensForDeposit(token, amount, options)
Approves given amount
of token
to rootChainContract
.
token
must be valid ERC20 token addressamount
must be token amount in wei (string, not in Number)options
(optional) must be valid javascript object containing from
, gasPrice
, gasLimit
, nonce
, value
, onTransactionHash
, onReceipt
or onError
from
must be valid account address(required)gasPrice
same as Ethereum sendTransaction
gasLimit
same as Ethereum sendTransaction
nonce
same as Ethereum sendTransaction
value
contains ETH value. Same as Ethereum sendTransaction
.
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
matic.approveERC20TokensForDeposit('0x718Ca123...', '1000000000000000000', {
from: '0xABc578455...',
})
matic.depositERC20ForUser(token, user, amount, options)
Deposit given amount
of token
with user user
.
token
must be valid ERC20 token addressuser
must be value account addressamount
must be token amount in wei (string, not in Number)options
see more infomation here
encodeAbi
must be boolean value. For Byte code of transaction, use encodeAbi: true
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
const user = <your-address> or <any-account-address>
matic.depositToken('0x718Ca123...', user, '1000000000000000000', {
from: '0xABc578455...'
})
matic.safeDepositERC721Tokens(token, tokenId, options)
Deposit given TokenID
of token
with user user
.
token
must be valid ERC20 token addresstokenId
must be valid token IDoptions
see more infomation here
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
matic.safeDepositERC721Tokens('0x718Ca123...', '70000000000', {
from: '0xABc578455...',
})
matic.transferERC20Tokens(token, user, amount, options)
Transfer given amount
of token
to user
.
token
must be valid ERC20 token addressuser
must be value account addressamount
must be token amount in wei (string, not in Number)options
see more infomation here
parent
must be boolean value. For token transfer on Main chain, use parent: true
encodeAbi
must be boolean value. For Byte code of transaction, use encodeAbi: true
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
const user = <your-address> or <any-account-address>
matic.transferERC20Tokens('0x718Ca123...', user, '1000000000000000000', {
from: '0xABc578455...',
})
matic.transferERC721Tokens(token, user, tokenId, options)
Transfer given tokenId
of token
to user
.
token
must be valid ERC721 token addressuser
must be value account addresstokenId
must be token amount in wei (string, not in Number)options
see more infomation here
parent
must be boolean value. For token transfer on Main chain, use parent: true
encodeAbi
must be boolean value. For Byte code of transaction, use encodeAbi: true
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
const user = <your-address> or <any-account-address>
matic.transferERC721Tokens('0x718Ca123...', user, '100006500000000000000', {
from: '0xABc578455...',
})
matic.getTransferSignature(toSell, toBuy)
Off-chain signature generation for transferWithSig function call
-
toSell
object
token
: address of token owned,amount
: amount/tokenId of the token to sell,expiry
: expiry (block number after which the signature should be invalid),orderId
: a random 32 byte hex string,spender
: the address approved to execute this transaction
-
toBuy
object
token
: address of token to buyamount
: amount/tokenId of token to buy
-
options
see more infomation here
from
: owner of the token (toSell)
let toSell = {
token: token2,
amount: value2,
expiry: expire,
orderId: orderId,
spender: spender,
}
let toBuy = {
token: token1,
amount: value1,
}
const sig = await matic.getTransferSignature(toSell, toBuy, {
from: tokenOwner,
})
matic.transferWithSignature(sig, toSell, toBuy, orderFiller)
Executes transferWithSig on child token (erc20/721). Takes input as signature generated from matic.getTransferSignature
sig
: signature generated with matic.getTransferSignaturetoSell
: object
token
: address of token owned,amount
: amount/tokenId of the token to sell,expiry
: expiry (block number after which the signature should be invalid),orderId
: a random 32 byte hex string,spender
: the address approved to execute this transaction
toBuy
: object
token
: address of token to buyamount
: amount/tokenId of token to buy
orderFiller
: address of user to transfer the tokens tooptions
see more infomation here
from
: the approved spender in the toSell
object by the token owner
transfers toSell.token
from tokenOwner
to orderFiller
let toSell = {
token: token2,
amount: value2,
expiry: expire,
orderId: orderId,
spender: spender,
}
let toBuy = {
token: token1,
amount: value1,
}
let sig = await matic.getTransferSignature(toSell, toBuy, { from: tokenOwner })
const tx = await matic.transferWithSignature(
sig,
toSell,
toBuy,
orderFiller,
{
from: spender,
}
)
matic.startWithdraw(token, amount, options)
Start withdraw process with given amount
for token
.
token
must be valid ERC20 token addressamount
must be token amount in wei (string, not in Number)options
see more infomation here
encodeAbi
must be boolean value. For Byte code of transaction, use encodeAbi: true
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
matic.startWithdraw('0x718Ca123...', '1000000000000000000', {
from: '0xABc578455...',
})
matic.startWithdrawForNFT(token, tokenId, options)
Start withdraw process with given tokenId
for token
.
token
must be valid ERC721 token addresstokenId
must be token tokenId (string, not in Number)options
see more infomation here
encodeAbi
must be boolean value. For Byte code of transaction, use encodeAbi: true
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
matic.startWithdrawForNFT('0x718Ca123...', '1000000000000000000', {
from: '0xABc578455...',
})
matic.withdraw(txId, options)
Withdraw tokens on mainchain using txId
from startWithdraw
method after header has been submitted to mainchain.
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
matic.withdraw('0xabcd...789', {
from: '0xABc578455...',
})
matic.withdrawNFT(txId, options)
Withdraw tokens on mainchain using txId
from startWithdraw
method after header has been submitted to mainchain.
txId
must be valid tx hashoptions
see more infomation here
encodeAbi
must be boolean value. For Byte code of transaction, use encodeAbi: true
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
matic.withdrawNFT('0xabcd...789', {
from: '0xABc578455...',
})
matic.processExits(rootTokenAddress, options)
Call processExits after completion of challenge period, after that withdrawn funds get transfered to your account on mainchain
rootTokenAddress
RootToken addressoptions
see more infomation here
encodeAbi
must be boolean value. For Byte code of transaction, use encodeAbi: true
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
matic.processExits('0xabcd...789', {
from: '0xABc578455...',
})
WithdrawManager
matic.withdrawManager.startExitForMintableBurntToken(burnTxHash, predicate: address, options)
/**
* Start an exit for a token that was minted and burnt on the side chain
* Wrapper over contract call: MintableERC721Predicate.startExitForMintableBurntToken
* @param burnTxHash Hash of the burn transaction on Matic
* @param predicate address of MintableERC721Predicate
*/
See MintableERC721Predicate.startExitForMintableBurntToken
const burn = await this.maticClient.startWithdrawForNFT(childErc721.address, tokenId)
await this.maticClient.withdrawManager.startExitForMintableBurntToken(burn.transactionHash, predicate.address)
matic.withdrawManager.startExitForMintableBurntToken(burnTxHash, predicate: address, options)
/**
* Start an exit for a token with metadata (token uri) that was minted and burnt on the side chain
* Wrapper over contract call: MintableERC721Predicate.startExitForMetadataMintableBurntToken
* @param burnTxHash Hash of the burn transaction on Matic
* @param predicate address of MintableERC721Predicate
*/
See MintableERC721Predicate.startExitForMetadataMintableBurntToken
const burn = await this.maticClient.startWithdrawForNFT(childErc721.address, tokenId)
await this.maticClient.withdrawManager.startExitForMetadataMintableBurntToken(burn.transactionHash, predicate.address)
POS Portal
maticPOSClient.approveERC20ForDeposit(rootToken, amount, options)
Approves given amount
of rootToken
to POS Portal contract.
rootToken
must be valid ERC20 token addressamount
must be token amount in wei (string, not in Number)options
see more infomation here
encodeAbi
must be boolean value. For Byte code of transaction, use encodeAbi: true
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
maticPOSClient.approveERC20ForDeposit('0x718Ca123...', '1000000000000000000', {
from: '0xABc578455...',
})
maticPOSClient.depositERC20ForUser(rootToken, user, amount, options)
Deposit given amount
of rootToken
for user
via POS Portal.
rootToken
must be valid ERC20 token addressuser
must be valid account addressamount
must be token amount in wei (string, not in Number)options
see more infomation here
encodeAbi
must be boolean value. For Byte code of transaction, use encodeAbi: true
The given amount must be approved for deposit beforehand.
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
const user = <your-address> or <any-account-address>
maticPOSClient.depositERC20ForUser('0x718Ca123...', user, '1000000000000000000', {
from: '0xABc578455...'
})
maticPOSClient.depositEtherForUser(rootToken, user, amount, options)
Deposit given amount
of ETH for user
via POS Portal.
ETH is an ERC20 token on Matic chain, follow ERC20 burn and exit to withdraw it.
user
must be valid account addressamount
must be ETH amount in wei (string, not in Number)options
see more infomation here
encodeAbi
must be boolean value. For Byte code of transaction, use encodeAbi: true
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
const user = <your-address> or <any-account-address>
maticPOSClient.depositEtherForUser(user, '1000000000000000000', {
from: '0xABc578455...'
})
maticPOSClient.burnERC20(childToken, amount, options)
Burn given amount
of childToken
to be exited from POS Portal.
childToken
must be valid ERC20 token addressamount
must be token amount in wei (string, not in Number)options
see more infomation here
encodeAbi
must be boolean value. For Byte code of transaction, use encodeAbi: true
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
maticPOSClient.burnERC20('0x718Ca123...', '1000000000000000000', {
from: '0xABc578455...',
})
maticPOSClient.exitERC20(burnTxHash, options)
Exit tokens from POS Portal. This can be called after checkpoint has been submitted for the block containing burn tx.
This returns Promise
object, which will be fulfilled when transaction gets confirmed (when receipt is generated).
Example:
maticPOSClient.exitERC20('0xabcd...789', {
from: '0xABc578455...',
})
Support
Please write to info@matic.network for integration support. If you have any queries, feedback or feature requests, feel free to reach out to us on telegram: t.me/maticnetwork
License
MIT