commit
5b6a0bb696
@ -1,15 +1,11 @@
|
|||||||
MERKLE_TREE_HEIGHT=20
|
MERKLE_TREE_HEIGHT=20
|
||||||
# in wei
|
# in wei
|
||||||
ETH_AMOUNT=100000000000000000
|
ETH_AMOUNT=100000000000000000
|
||||||
|
# check config.js
|
||||||
TOKEN_AMOUNT=100000000000000000
|
TOKEN_AMOUNT=100000000000000000
|
||||||
PRIVATE_KEY=
|
|
||||||
ERC20_TOKEN=
|
ERC20_TOKEN=
|
||||||
|
|
||||||
# DAI mirror in Kovan
|
PRIVATE_KEY=
|
||||||
#ERC20_TOKEN=0xd2b1a6b34f4a68425e7c28b4db5a37be3b7a4947
|
|
||||||
# the block when 0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1 has some DAI is 13146218
|
|
||||||
|
|
||||||
# USDT mirror in Kovan
|
|
||||||
#ERC20_TOKEN=0xf3e0d7bf58c5d455d31ef1c2d5375904df525105
|
#ERC20_TOKEN=0xf3e0d7bf58c5d455d31ef1c2d5375904df525105
|
||||||
#TOKEN_AMOUNT=1000000
|
#TOKEN_AMOUNT=1000000
|
||||||
# the block when 0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1 has some USDT is 13147586
|
|
||||||
|
10
README.md
10
README.md
@ -1,15 +1,15 @@
|
|||||||
# Warning!
|
# Warning!
|
||||||
Current cli version doesn't support [Anonymity Mining](https://tornado-cash.medium.com/tornado-cash-governance-proposal-a55c5c7d0703)
|
Current cli version doesn't support [Anonymity Mining](https://tornado-cash.medium.com/tornado-cash-governance-proposal-a55c5c7d0703)
|
||||||
|
|
||||||
### Kovan, Mainnet
|
### Goerli, Mainnet
|
||||||
1. Add `PRIVATE_KEY` to `.env` file
|
1. Add `PRIVATE_KEY` to `.env` file
|
||||||
2. `./cli.js --help`
|
2. `./cli.js --help`
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
```bash
|
```bash
|
||||||
$ ./cli.js deposit ETH 0.1 --rpc https://kovan.infura.io/v3/27a9649f826b4e31a83e07ae09a87448
|
$ ./cli.js deposit ETH 0.1 --rpc https://goerli.infura.io/v3/27a9649f826b4e31a83e07ae09a87448
|
||||||
|
|
||||||
Your note: tornado-eth-0.1-42-0xf73dd6833ccbcc046c44228c8e2aa312bf49e08389dadc7c65e6a73239867b7ef49c705c4db227e2fadd8489a494b6880bdcb6016047e019d1abec1c7652
|
Your note: tornado-eth-0.1-5-0xf73dd6833ccbcc046c44228c8e2aa312bf49e08389dadc7c65e6a73239867b7ef49c705c4db227e2fadd8489a494b6880bdcb6016047e019d1abec1c7652
|
||||||
Tornado ETH balance is 8.9
|
Tornado ETH balance is 8.9
|
||||||
Sender account ETH balance is 1004873.470619891361352542
|
Sender account ETH balance is 1004873.470619891361352542
|
||||||
Submitting deposit transaction
|
Submitting deposit transaction
|
||||||
@ -18,14 +18,14 @@ Sender account ETH balance is 1004873.361652048361352542
|
|||||||
```
|
```
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ ./cli.js withdraw tornado-eth-0.1-42-0xf73dd6833ccbcc046c44228c8e2aa312bf49e08389dadc7c65e6a73239867b7ef49c705c4db227e2fadd8489a494b6880bdcb6016047e019d1abec1c7652 0x8589427373D6D84E98730D7795D8f6f8731FDA16 --rpc https://kovan.infura.io/v3/27a9649f826b4e31a83e07ae09a87448 --relayer https://kovan-frelay.duckdns.org
|
$ ./cli.js withdraw tornado-eth-0.1-5-0xf73dd6833ccbcc046c44228c8e2aa312bf49e08389dadc7c65e6a73239867b7ef49c705c4db227e2fadd8489a494b6880bdcb6016047e019d1abec1c7652 0x8589427373D6D84E98730D7795D8f6f8731FDA16 --rpc https://goerli.infura.io/v3/27a9649f826b4e31a83e07ae09a87448 --relayer https://goerli-frelay.duckdns.org
|
||||||
|
|
||||||
Relay address: 0x6A31736e7490AbE5D5676be059DFf064AB4aC754
|
Relay address: 0x6A31736e7490AbE5D5676be059DFf064AB4aC754
|
||||||
Getting current state from tornado contract
|
Getting current state from tornado contract
|
||||||
Generating SNARK proof
|
Generating SNARK proof
|
||||||
Proof time: 9117.051ms
|
Proof time: 9117.051ms
|
||||||
Sending withdraw transaction through relay
|
Sending withdraw transaction through relay
|
||||||
Transaction submitted through the relay. View transaction on etherscan https://kovan.etherscan.io/tx/0xcb21ae8cad723818c6bc7273e83e00c8393fcdbe74802ce5d562acad691a2a7b
|
Transaction submitted through the relay. View transaction on etherscan https://goerli.etherscan.io/tx/0xcb21ae8cad723818c6bc7273e83e00c8393fcdbe74802ce5d562acad691a2a7b
|
||||||
Transaction mined in block 17036120
|
Transaction mined in block 17036120
|
||||||
Done
|
Done
|
||||||
```
|
```
|
||||||
|
103973
cache/deposits_eth_0.1.json
vendored
Normal file
103973
cache/deposits_eth_0.1.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
164481
cache/deposits_eth_1.json
vendored
Normal file
164481
cache/deposits_eth_1.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
131301
cache/deposits_eth_10.json
vendored
Normal file
131301
cache/deposits_eth_10.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
104148
cache/deposits_eth_100.json
vendored
Normal file
104148
cache/deposits_eth_100.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
76547
cache/withdrawals_eth_0.1.json
vendored
Normal file
76547
cache/withdrawals_eth_0.1.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
115390
cache/withdrawals_eth_1.json
vendored
Normal file
115390
cache/withdrawals_eth_1.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
119415
cache/withdrawals_eth_10.json
vendored
Normal file
119415
cache/withdrawals_eth_10.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
91716
cache/withdrawals_eth_100.json
vendored
Normal file
91716
cache/withdrawals_eth_100.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
123
cli.js
123
cli.js
@ -19,7 +19,7 @@ const config = require('./config')
|
|||||||
const program = require('commander')
|
const program = require('commander')
|
||||||
const { GasPriceOracle } = require('gas-price-oracle')
|
const { GasPriceOracle } = require('gas-price-oracle')
|
||||||
|
|
||||||
let web3, tornado, mixerContract, tornadoInstance, circuit, proving_key, groth16, erc20, senderAccount, netId
|
let web3, tornado, tornadoContract, tornadoInstance, circuit, proving_key, groth16, erc20, senderAccount, netId
|
||||||
let MERKLE_TREE_HEIGHT, ETH_AMOUNT, TOKEN_AMOUNT, PRIVATE_KEY
|
let MERKLE_TREE_HEIGHT, ETH_AMOUNT, TOKEN_AMOUNT, PRIVATE_KEY
|
||||||
|
|
||||||
/** Whether we are in a browser or node.js */
|
/** Whether we are in a browser or node.js */
|
||||||
@ -117,30 +117,49 @@ async function deposit({ currency, amount }) {
|
|||||||
* in it and generates merkle proof
|
* in it and generates merkle proof
|
||||||
* @param deposit Deposit object
|
* @param deposit Deposit object
|
||||||
*/
|
*/
|
||||||
async function generateMerkleProof(deposit) {
|
async function generateMerkleProof(deposit, amount) {
|
||||||
let leafIndex = -1
|
let leafIndex = -1
|
||||||
// Get all deposit events from smart contract and assemble merkle tree from them
|
// Get all deposit events from smart contract and assemble merkle tree from them
|
||||||
const events = await mixerContract.getPastEvents('Deposit', {
|
|
||||||
fromBlock: 0,
|
const cachedEvents = loadCachedEvents({ type: 'Deposit', amount })
|
||||||
|
|
||||||
|
const startBlock = cachedEvents.lastBlock
|
||||||
|
|
||||||
|
let rpcEvents = await tornadoContract.getPastEvents('Deposit', {
|
||||||
|
fromBlock: startBlock,
|
||||||
toBlock: 'latest'
|
toBlock: 'latest'
|
||||||
})
|
})
|
||||||
|
|
||||||
const leaves = events
|
rpcEvents = rpcEvents.map(({ blockNumber, transactionHash, returnValues }) => {
|
||||||
.sort((a, b) => a.returnValues.leafIndex - b.returnValues.leafIndex) // Sort events in chronological order
|
const { commitment, leafIndex, timestamp } = returnValues
|
||||||
.map((e) => {
|
return {
|
||||||
const index = toBN(e.returnValues.leafIndex).toNumber()
|
blockNumber,
|
||||||
|
transactionHash,
|
||||||
|
commitment,
|
||||||
|
leafIndex: Number(leafIndex),
|
||||||
|
timestamp
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (toBN(e.returnValues.commitment).eq(toBN(deposit.commitmentHex))) {
|
const events = cachedEvents.events.concat(rpcEvents)
|
||||||
|
console.log('events', events.length)
|
||||||
|
|
||||||
|
const leaves = events
|
||||||
|
.sort((a, b) => a.leafIndex - b.leafIndex) // Sort events in chronological order
|
||||||
|
.map((e) => {
|
||||||
|
const index = toBN(e.leafIndex).toNumber()
|
||||||
|
|
||||||
|
if (toBN(e.commitment).eq(toBN(deposit.commitmentHex))) {
|
||||||
leafIndex = index
|
leafIndex = index
|
||||||
}
|
}
|
||||||
return e.returnValues.commitment.toString(10)
|
return toBN(e.commitment).toString(10)
|
||||||
})
|
})
|
||||||
const tree = new merkleTree(MERKLE_TREE_HEIGHT, leaves)
|
const tree = new merkleTree(MERKLE_TREE_HEIGHT, leaves)
|
||||||
|
|
||||||
// Validate that our data is correct
|
// Validate that our data is correct
|
||||||
const root = await tree.root()
|
const root = await tree.root()
|
||||||
const isValidRoot = await mixerContract.methods.isKnownRoot(toHex(root)).call()
|
const isValidRoot = await tornadoContract.methods.isKnownRoot(toHex(root)).call()
|
||||||
const isSpent = await mixerContract.methods.isSpent(toHex(deposit.nullifierHash)).call()
|
const isSpent = await tornadoContract.methods.isSpent(toHex(deposit.nullifierHash)).call()
|
||||||
assert(isValidRoot === true, 'Merkle tree is corrupted')
|
assert(isValidRoot === true, 'Merkle tree is corrupted')
|
||||||
assert(isSpent === false, 'The note is already spent')
|
assert(isSpent === false, 'The note is already spent')
|
||||||
assert(leafIndex >= 0, 'The deposit is not found in the tree')
|
assert(leafIndex >= 0, 'The deposit is not found in the tree')
|
||||||
@ -157,9 +176,9 @@ async function generateMerkleProof(deposit) {
|
|||||||
* @param fee Relayer fee
|
* @param fee Relayer fee
|
||||||
* @param refund Receive ether for exchanged tokens
|
* @param refund Receive ether for exchanged tokens
|
||||||
*/
|
*/
|
||||||
async function generateProof({ deposit, recipient, relayerAddress = 0, fee = 0, refund = 0 }) {
|
async function generateProof({ deposit, amount, recipient, relayerAddress = 0, fee = 0, refund = 0 }) {
|
||||||
// Compute merkle proof of our commitment
|
// Compute merkle proof of our commitment
|
||||||
const { root, path_elements, path_index } = await generateMerkleProof(deposit)
|
const { root, path_elements, path_index } = await generateMerkleProof(deposit, amount)
|
||||||
|
|
||||||
// Prepare circuit input
|
// Prepare circuit input
|
||||||
const input = {
|
const input = {
|
||||||
@ -232,13 +251,7 @@ async function withdraw({ deposit, currency, amount, recipient, relayerURL, refu
|
|||||||
throw new Error('Too high refund')
|
throw new Error('Too high refund')
|
||||||
}
|
}
|
||||||
|
|
||||||
const { proof, args } = await generateProof({
|
const { proof, args } = await generateProof({ deposit, amount, recipient, relayerAddress: rewardAccount, fee, refund })
|
||||||
deposit,
|
|
||||||
recipient,
|
|
||||||
relayerAddress: rewardAccount,
|
|
||||||
fee,
|
|
||||||
refund
|
|
||||||
})
|
|
||||||
|
|
||||||
console.log('Sending withdraw transaction through relay')
|
console.log('Sending withdraw transaction through relay')
|
||||||
try {
|
try {
|
||||||
@ -476,6 +489,30 @@ function waitForTxReceipt({ txHash, attempts = 60, delay = 1000 }) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function loadCachedEvents({ type, amount }) {
|
||||||
|
try {
|
||||||
|
if (netId !== 1) {
|
||||||
|
return {
|
||||||
|
events: [],
|
||||||
|
lastBlock: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const module = require(`./cache/${type.toLowerCase()}s_eth_${amount}.json`)
|
||||||
|
|
||||||
|
if (module) {
|
||||||
|
const events = module
|
||||||
|
|
||||||
|
return {
|
||||||
|
events,
|
||||||
|
lastBlock: events[events.length - 1].blockNumber
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error(`Method loadCachedEvents has error: ${err.message}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses Tornado.cash note
|
* Parses Tornado.cash note
|
||||||
* @param noteString the note
|
* @param noteString the note
|
||||||
@ -503,7 +540,7 @@ function parseNote(noteString) {
|
|||||||
|
|
||||||
async function loadDepositData({ deposit }) {
|
async function loadDepositData({ deposit }) {
|
||||||
try {
|
try {
|
||||||
const eventWhenHappened = await tornado.getPastEvents('Deposit', {
|
const eventWhenHappened = await tornadoContract.getPastEvents('Deposit', {
|
||||||
filter: {
|
filter: {
|
||||||
commitment: deposit.commitmentHex
|
commitment: deposit.commitmentHex
|
||||||
},
|
},
|
||||||
@ -516,7 +553,7 @@ async function loadDepositData({ deposit }) {
|
|||||||
|
|
||||||
const { timestamp } = eventWhenHappened[0].returnValues
|
const { timestamp } = eventWhenHappened[0].returnValues
|
||||||
const txHash = eventWhenHappened[0].transactionHash
|
const txHash = eventWhenHappened[0].transactionHash
|
||||||
const isSpent = await tornado.methods.isSpent(deposit.nullifierHex).call()
|
const isSpent = await tornadoContract.methods.isSpent(deposit.nullifierHex).call()
|
||||||
const receipt = await web3.eth.getTransactionReceipt(txHash)
|
const receipt = await web3.eth.getTransactionReceipt(txHash)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@ -533,23 +570,40 @@ async function loadDepositData({ deposit }) {
|
|||||||
}
|
}
|
||||||
async function loadWithdrawalData({ amount, currency, deposit }) {
|
async function loadWithdrawalData({ amount, currency, deposit }) {
|
||||||
try {
|
try {
|
||||||
const events = await await tornado.getPastEvents('Withdrawal', {
|
const cachedEvents = loadCachedEvents({ type: 'Withdrawal', amount })
|
||||||
fromBlock: 0,
|
|
||||||
|
const startBlock = cachedEvents.lastBlock
|
||||||
|
|
||||||
|
let rpcEvents = await tornadoContract.getPastEvents('Withdrawal', {
|
||||||
|
fromBlock: startBlock,
|
||||||
toBlock: 'latest'
|
toBlock: 'latest'
|
||||||
})
|
})
|
||||||
|
|
||||||
|
rpcEvents = rpcEvents.map(({ blockNumber, transactionHash, returnValues }) => {
|
||||||
|
const { nullifierHash, to, fee } = returnValues
|
||||||
|
return {
|
||||||
|
blockNumber,
|
||||||
|
transactionHash,
|
||||||
|
nullifierHash,
|
||||||
|
to,
|
||||||
|
fee
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const events = cachedEvents.events.concat(rpcEvents)
|
||||||
|
|
||||||
const withdrawEvent = events.filter((event) => {
|
const withdrawEvent = events.filter((event) => {
|
||||||
return event.returnValues.nullifierHash === deposit.nullifierHex
|
return event.nullifierHash === deposit.nullifierHex
|
||||||
})[0]
|
})[0]
|
||||||
|
|
||||||
const fee = withdrawEvent.returnValues.fee
|
const fee = withdrawEvent.fee
|
||||||
const decimals = config.deployments[`netId${netId}`][currency].decimals
|
const decimals = config.deployments[`netId${netId}`][currency].decimals
|
||||||
const withdrawalAmount = toBN(fromDecimals({ amount, decimals })).sub(toBN(fee))
|
const withdrawalAmount = toBN(fromDecimals({ amount, decimals })).sub(toBN(fee))
|
||||||
const { timestamp } = await web3.eth.getBlock(withdrawEvent.blockHash)
|
const { timestamp } = await web3.eth.getBlock(withdrawEvent.blockNumber)
|
||||||
return {
|
return {
|
||||||
amount: toDecimals(withdrawalAmount, decimals, 9),
|
amount: toDecimals(withdrawalAmount, decimals, 9),
|
||||||
txHash: withdrawEvent.transactionHash,
|
txHash: withdrawEvent.transactionHash,
|
||||||
to: withdrawEvent.returnValues.to,
|
to: withdrawEvent.to,
|
||||||
timestamp,
|
timestamp,
|
||||||
nullifier: deposit.nullifierHex,
|
nullifier: deposit.nullifierHex,
|
||||||
fee: toDecimals(fee, decimals, 9)
|
fee: toDecimals(fee, decimals, 9)
|
||||||
@ -563,7 +617,7 @@ async function loadWithdrawalData({ amount, currency, deposit }) {
|
|||||||
* Init web3, contracts, and snark
|
* Init web3, contracts, and snark
|
||||||
*/
|
*/
|
||||||
async function init({ rpc, noteNetId, currency = 'dai', amount = '100' }) {
|
async function init({ rpc, noteNetId, currency = 'dai', amount = '100' }) {
|
||||||
let contractJson, mixerJson, erc20ContractJson, erc20tornadoJson, tornadoAddress, tokenAddress
|
let contractJson, instanceJson, erc20ContractJson, erc20tornadoJson, tornadoAddress, tokenAddress
|
||||||
// TODO do we need this? should it work in browser really?
|
// TODO do we need this? should it work in browser really?
|
||||||
if (inBrowser) {
|
if (inBrowser) {
|
||||||
// Initialize using injected web3 (Metamask)
|
// Initialize using injected web3 (Metamask)
|
||||||
@ -572,7 +626,7 @@ async function init({ rpc, noteNetId, currency = 'dai', amount = '100' }) {
|
|||||||
transactionConfirmationBlocks: 1
|
transactionConfirmationBlocks: 1
|
||||||
})
|
})
|
||||||
contractJson = await (await fetch('build/contracts/TornadoProxy.abi.json')).json()
|
contractJson = await (await fetch('build/contracts/TornadoProxy.abi.json')).json()
|
||||||
mixerJson = await (await fetch('build/contracts/Mixer.abi.json')).json()
|
instanceJson = await (await fetch('build/contracts/Instance.abi.json')).json()
|
||||||
circuit = await (await fetch('build/circuits/tornado.json')).json()
|
circuit = await (await fetch('build/circuits/tornado.json')).json()
|
||||||
proving_key = await (await fetch('build/circuits/tornadoProvingKey.bin')).arrayBuffer()
|
proving_key = await (await fetch('build/circuits/tornadoProvingKey.bin')).arrayBuffer()
|
||||||
MERKLE_TREE_HEIGHT = 20
|
MERKLE_TREE_HEIGHT = 20
|
||||||
@ -583,7 +637,7 @@ async function init({ rpc, noteNetId, currency = 'dai', amount = '100' }) {
|
|||||||
// Initialize from local node
|
// Initialize from local node
|
||||||
web3 = new Web3(rpc, null, { transactionConfirmationBlocks: 1 })
|
web3 = new Web3(rpc, null, { transactionConfirmationBlocks: 1 })
|
||||||
contractJson = require('./build/contracts/TornadoProxy.abi.json')
|
contractJson = require('./build/contracts/TornadoProxy.abi.json')
|
||||||
mixerJson = require('./build/contracts/Mixer.abi.json')
|
instanceJson = require('./build/contracts/Instance.abi.json')
|
||||||
circuit = require('./build/circuits/tornado.json')
|
circuit = require('./build/circuits/tornado.json')
|
||||||
proving_key = fs.readFileSync('build/circuits/tornadoProvingKey.bin').buffer
|
proving_key = fs.readFileSync('build/circuits/tornadoProvingKey.bin').buffer
|
||||||
MERKLE_TREE_HEIGHT = process.env.MERKLE_TREE_HEIGHT || 20
|
MERKLE_TREE_HEIGHT = process.env.MERKLE_TREE_HEIGHT || 20
|
||||||
@ -628,7 +682,7 @@ async function init({ rpc, noteNetId, currency = 'dai', amount = '100' }) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
tornado = new web3.eth.Contract(contractJson, tornadoAddress)
|
tornado = new web3.eth.Contract(contractJson, tornadoAddress)
|
||||||
mixerContract = new web3.eth.Contract(mixerJson, tornadoInstance)
|
tornadoContract = new web3.eth.Contract(instanceJson, tornadoInstance)
|
||||||
erc20 = currency !== 'eth' ? new web3.eth.Contract(erc20ContractJson.abi, tokenAddress) : {}
|
erc20 = currency !== 'eth' ? new web3.eth.Contract(erc20ContractJson.abi, tokenAddress) : {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -704,8 +758,9 @@ async function main() {
|
|||||||
console.log('From :', `https://${getCurrentNetworkName()}etherscan.io/address/${depositInfo.from}`)
|
console.log('From :', `https://${getCurrentNetworkName()}etherscan.io/address/${depositInfo.from}`)
|
||||||
console.log('Transaction :', `https://${getCurrentNetworkName()}etherscan.io/tx/${depositInfo.txHash}`)
|
console.log('Transaction :', `https://${getCurrentNetworkName()}etherscan.io/tx/${depositInfo.txHash}`)
|
||||||
console.log('Commitment :', depositInfo.commitment)
|
console.log('Commitment :', depositInfo.commitment)
|
||||||
if (deposit.isSpent) {
|
if (!deposit.isSpent) {
|
||||||
console.log('The note was not spent')
|
console.log('The note was not spent')
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const withdrawInfo = await loadWithdrawalData({
|
const withdrawInfo = await loadWithdrawalData({
|
||||||
|
288
config.js
288
config.js
@ -3,208 +3,162 @@ require('dotenv').config()
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
deployments: {
|
deployments: {
|
||||||
netId1: {
|
netId1: {
|
||||||
eth: {
|
'eth': {
|
||||||
instanceAddress: {
|
'instanceAddress': {
|
||||||
'0.1': '0x12D66f87A04A9E220743712cE6d9bB1B5616B8Fc',
|
|
||||||
'1': '0x47CE0C6eD5B0Ce3d3A51fdb1C52DC66a7c3c2936',
|
'1': '0x47CE0C6eD5B0Ce3d3A51fdb1C52DC66a7c3c2936',
|
||||||
'10': '0x910Cbd523D972eb0a6f4cAe4618aD62622b39DbF',
|
'10': '0x910Cbd523D972eb0a6f4cAe4618aD62622b39DbF',
|
||||||
'100': '0xA160cdAB225685dA1d56aa342Ad8841c3b53f291'
|
'100': '0xA160cdAB225685dA1d56aa342Ad8841c3b53f291',
|
||||||
|
'0.1': '0x12D66f87A04A9E220743712cE6d9bB1B5616B8Fc'
|
||||||
},
|
},
|
||||||
symbol: 'ETH',
|
'miningEnabled': true,
|
||||||
decimals: 18
|
'symbol': 'ETH',
|
||||||
|
'decimals': 18
|
||||||
},
|
},
|
||||||
dai: {
|
'dai': {
|
||||||
instanceAddress: {
|
'instanceAddress': {
|
||||||
'100': '0xD4B88Df4D29F5CedD6857912842cff3b20C8Cfa3',
|
'100': '0xD4B88Df4D29F5CedD6857912842cff3b20C8Cfa3',
|
||||||
'1000': '0xFD8610d20aA15b7B2E3Be39B396a1bC3516c7144',
|
'1000': '0xFD8610d20aA15b7B2E3Be39B396a1bC3516c7144',
|
||||||
'10000': '0xF60dD140cFf0706bAE9Cd734Ac3ae76AD9eBC32A',
|
'10000': '0x07687e702b410Fa43f4cB4Af7FA097918ffD2730',
|
||||||
'100000': undefined
|
'100000': '0x23773E65ed146A459791799d01336DB287f25334'
|
||||||
},
|
},
|
||||||
tokenAddress: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
|
'miningEnabled': true,
|
||||||
symbol: 'DAI',
|
'tokenAddress': '0x6B175474E89094C44Da98b954EedeAC495271d0F',
|
||||||
decimals: 18
|
'symbol': 'DAI',
|
||||||
|
'decimals': 18,
|
||||||
|
'gasLimit': '55000'
|
||||||
},
|
},
|
||||||
cdai: {
|
'cdai': {
|
||||||
instanceAddress: {
|
'instanceAddress': {
|
||||||
'5000': '0x22aaA7720ddd5388A3c0A3333430953C68f1849b',
|
'5000': '0x22aaA7720ddd5388A3c0A3333430953C68f1849b',
|
||||||
'50000': '0xBA214C1c1928a32Bffe790263E38B4Af9bFCD659',
|
'50000': '0x03893a7c7463AE47D46bc7f091665f1893656003',
|
||||||
'500000': '0xb1C8094B234DcE6e03f10a5b673c1d8C69739A00',
|
'500000': '0x2717c5e28cf931547B621a5dddb772Ab6A35B701',
|
||||||
'5000000': undefined
|
'5000000': '0xD21be7248e0197Ee08E0c20D4a96DEBdaC3D20Af'
|
||||||
},
|
},
|
||||||
tokenAddress: '0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643',
|
'miningEnabled': true,
|
||||||
symbol: 'cDAI',
|
'tokenAddress': '0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643',
|
||||||
decimals: 8
|
'symbol': 'cDAI',
|
||||||
|
'decimals': 8,
|
||||||
|
'gasLimit': '425000'
|
||||||
},
|
},
|
||||||
usdc: {
|
'usdc': {
|
||||||
instanceAddress: {
|
'instanceAddress': {
|
||||||
'100': '0xd96f2B1c14Db8458374d9Aca76E26c3D18364307',
|
'100': '0xd96f2B1c14Db8458374d9Aca76E26c3D18364307',
|
||||||
'1000': '0x4736dCf1b7A3d580672CcE6E7c65cd5cc9cFBa9D',
|
'1000': '0x4736dCf1b7A3d580672CcE6E7c65cd5cc9cFBa9D',
|
||||||
'10000': '0xD691F27f38B395864Ea86CfC7253969B409c362d',
|
'10000': '',
|
||||||
'100000': undefined
|
'100000': ''
|
||||||
},
|
},
|
||||||
tokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
'miningEnabled': false,
|
||||||
symbol: 'USDC',
|
'tokenAddress': '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
||||||
decimals: 6
|
'symbol': 'USDC',
|
||||||
|
'decimals': 6,
|
||||||
|
'gasLimit': '80000'
|
||||||
},
|
},
|
||||||
cusdc: {
|
'usdt': {
|
||||||
instanceAddress: {
|
'instanceAddress': {
|
||||||
'5000': '0xaEaaC358560e11f52454D997AAFF2c5731B6f8a6',
|
|
||||||
'50000': '0x1356c899D8C9467C7f71C195612F8A395aBf2f0a',
|
|
||||||
'500000': '0xA60C772958a3eD56c1F15dD055bA37AC8e523a0D',
|
|
||||||
'5000000': undefined
|
|
||||||
},
|
|
||||||
tokenAddress: '0x39AA39c021dfbaE8faC545936693aC917d5E7563',
|
|
||||||
symbol: 'cUSDC',
|
|
||||||
decimals: 8
|
|
||||||
},
|
|
||||||
usdt: {
|
|
||||||
instanceAddress: {
|
|
||||||
'100': '0x169AD27A470D064DEDE56a2D3ff727986b15D52B',
|
'100': '0x169AD27A470D064DEDE56a2D3ff727986b15D52B',
|
||||||
'1000': '0x0836222F2B2B24A3F36f98668Ed8F0B38D1a872f',
|
'1000': '0x0836222F2B2B24A3F36f98668Ed8F0B38D1a872f',
|
||||||
'10000': '0xF67721A2D8F736E75a49FdD7FAd2e31D8676542a',
|
'10000': '',
|
||||||
'100000': '0x9AD122c22B14202B4490eDAf288FDb3C7cb3ff5E'
|
'100000': ''
|
||||||
},
|
},
|
||||||
tokenAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
|
'miningEnabled': false,
|
||||||
symbol: 'USDT',
|
'tokenAddress': '0xdAC17F958D2ee523a2206206994597C13D831ec7',
|
||||||
decimals: 6
|
'symbol': 'USDT',
|
||||||
|
'decimals': 6,
|
||||||
|
'gasLimit': '100000'
|
||||||
},
|
},
|
||||||
proxy: '0x905b63Fff465B9fFBF41DeA908CEb12478ec7601',
|
'wbtc': {
|
||||||
|
'instanceAddress': {
|
||||||
|
'0.1': '0x178169B423a011fff22B9e3F3abeA13414dDD0F1',
|
||||||
|
'1': '0x610B717796ad172B316836AC95a2ffad065CeaB4',
|
||||||
|
'10': '0xbB93e510BbCD0B7beb5A853875f9eC60275CF498',
|
||||||
|
'100': ''
|
||||||
|
},
|
||||||
|
'miningEnabled': true,
|
||||||
|
'tokenAddress': '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',
|
||||||
|
'symbol': 'WBTC',
|
||||||
|
'decimals': 8,
|
||||||
|
'gasLimit': '85000'
|
||||||
|
},
|
||||||
|
proxy: '0x722122dF12D4e14e13Ac3b6895a86e84145b6967',
|
||||||
},
|
},
|
||||||
netId5: {
|
netId5: {
|
||||||
eth: {
|
'eth': {
|
||||||
instanceAddress: {
|
'instanceAddress': {
|
||||||
'0.1': '0x6Bf694a291DF3FeC1f7e69701E3ab6c592435Ae7',
|
|
||||||
'1': '0x3aac1cC67c2ec5Db4eA850957b967Ba153aD6279',
|
'1': '0x3aac1cC67c2ec5Db4eA850957b967Ba153aD6279',
|
||||||
'10': '0x723B78e67497E85279CB204544566F4dC5d2acA0',
|
'10': '0x723B78e67497E85279CB204544566F4dC5d2acA0',
|
||||||
'100': '0x0E3A09dDA6B20aFbB34aC7cD4A6881493f3E7bf7'
|
'100': '0x0E3A09dDA6B20aFbB34aC7cD4A6881493f3E7bf7',
|
||||||
|
'0.1': '0x6Bf694a291DF3FeC1f7e69701E3ab6c592435Ae7'
|
||||||
},
|
},
|
||||||
symbol: 'ETH',
|
'miningEnabled': true,
|
||||||
decimals: 18
|
'symbol': 'ETH',
|
||||||
|
'decimals': 18
|
||||||
},
|
},
|
||||||
dai: {
|
'dai': {
|
||||||
instanceAddress: {
|
'instanceAddress': {
|
||||||
'100': '0xdf2d3cC5F361CF95b3f62c4bB66deFe3FDE47e3D',
|
'100': '0x76D85B4C0Fc497EeCc38902397aC608000A06607',
|
||||||
'1000': '0xD96291dFa35d180a71964D0894a1Ae54247C4ccD',
|
'1000': '0xCC84179FFD19A1627E79F8648d09e095252Bc418',
|
||||||
'10000': '0xb192794f72EA45e33C3DF6fe212B9c18f6F45AE3',
|
'10000': '0xD5d6f8D9e784d0e26222ad3834500801a68D027D',
|
||||||
'100000': undefined
|
'100000': '0x407CcEeaA7c95d2FE2250Bf9F2c105aA7AAFB512'
|
||||||
},
|
},
|
||||||
tokenAddress: '0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa',
|
'miningEnabled': true,
|
||||||
symbol: 'DAI',
|
'tokenAddress': '0xdc31Ee1784292379Fbb2964b3B9C4124D8F89C60',
|
||||||
decimals: 18
|
'symbol': 'DAI',
|
||||||
|
'decimals': 18,
|
||||||
|
'gasLimit': '55000'
|
||||||
},
|
},
|
||||||
cdai: {
|
'cdai': {
|
||||||
instanceAddress: {
|
'instanceAddress': {
|
||||||
'5000': '0x6Fc9386ABAf83147b3a89C36D422c625F44121C8',
|
'5000': '0x833481186f16Cece3f1Eeea1a694c42034c3a0dB',
|
||||||
'50000': '0x7182EA067e0f050997444FCb065985Fd677C16b6',
|
'50000': '0xd8D7DE3349ccaA0Fde6298fe6D7b7d0d34586193',
|
||||||
'500000': '0xC22ceFd90fbd1FdEeE554AE6Cc671179BC3b10Ae',
|
'500000': '0x8281Aa6795aDE17C8973e1aedcA380258Bc124F9',
|
||||||
'5000000': undefined
|
'5000000': '0x57b2B8c82F065de8Ef5573f9730fC1449B403C9f'
|
||||||
},
|
},
|
||||||
tokenAddress: '0xe7bc397DBd069fC7d0109C0636d06888bb50668c',
|
'miningEnabled': true,
|
||||||
symbol: 'cDAI',
|
'tokenAddress': '0x822397d9a55d0fefd20F5c4bCaB33C5F65bd28Eb',
|
||||||
decimals: 8
|
'symbol': 'cDAI',
|
||||||
|
'decimals': 8,
|
||||||
|
'gasLimit': '425000'
|
||||||
},
|
},
|
||||||
usdc: {
|
'usdc': {
|
||||||
instanceAddress: {
|
'instanceAddress': {
|
||||||
'100': '0x137E2B6d185018e7f09f6cf175a970e7fC73826C',
|
'100': '0x05E0b5B40B7b66098C2161A5EE11C5740A3A7C45',
|
||||||
'1000': '0xcC7f1633A5068E86E3830e692e3e3f8f520525Af',
|
'1000': '0x23173fE8b96A4Ad8d2E17fB83EA5dcccdCa1Ae52',
|
||||||
'10000': '0x28C8f149a0ab8A9bdB006B8F984fFFCCE52ef5EF',
|
'10000': '',
|
||||||
'100000': undefined
|
'100000': ''
|
||||||
},
|
},
|
||||||
tokenAddress: '0x75B0622Cec14130172EaE9Cf166B92E5C112FaFF',
|
'miningEnabled': false,
|
||||||
symbol: 'USDC',
|
'tokenAddress': '0xD87Ba7A50B2E7E660f678A895E4B72E7CB4CCd9C',
|
||||||
decimals: 6
|
'symbol': 'USDC',
|
||||||
|
'decimals': 6,
|
||||||
|
'gasLimit': '80000'
|
||||||
},
|
},
|
||||||
cusdc: {
|
'usdt': {
|
||||||
instanceAddress: {
|
'instanceAddress': {
|
||||||
'5000': '0xc0648F28ABA385c8a1421Bbf1B59e3c474F89cB0',
|
'100': '0x538Ab61E8A9fc1b2f93b3dd9011d662d89bE6FE6',
|
||||||
'50000': '0x0C53853379c6b1A7B74E0A324AcbDD5Eabd4981D',
|
'1000': '0x94Be88213a387E992Dd87DE56950a9aef34b9448',
|
||||||
'500000': '0xf84016A0E03917cBe700D318EB1b7a53e6e3dEe1',
|
'10000': '',
|
||||||
'5000000': undefined
|
'100000': ''
|
||||||
},
|
},
|
||||||
tokenAddress: '0xcfC9bB230F00bFFDB560fCe2428b4E05F3442E35',
|
'miningEnabled': false,
|
||||||
symbol: 'cUSDC',
|
'tokenAddress': '0xb7FC2023D96AEa94Ba0254AA5Aeb93141e4aad66',
|
||||||
decimals: 8
|
'symbol': 'USDT',
|
||||||
|
'decimals': 6,
|
||||||
|
'gasLimit': '100000'
|
||||||
},
|
},
|
||||||
usdt: {
|
'wbtc': {
|
||||||
instanceAddress: {
|
'instanceAddress': {
|
||||||
'100': '0x327853Da7916a6A0935563FB1919A48843036b42',
|
'0.1': '0x242654336ca2205714071898f67E254EB49ACdCe',
|
||||||
'1000': '0x531AA4DF5858EA1d0031Dad16e3274609DE5AcC0',
|
'1': '0x776198CCF446DFa168347089d7338879273172cF',
|
||||||
'10000': '0x0958275F0362cf6f07D21373aEE0cf37dFe415dD',
|
'10': '0xeDC5d01286f99A066559F60a585406f3878a033e',
|
||||||
'100000': '0x14aEd24B67EaF3FF28503eB92aeb217C47514364'
|
'100': ''
|
||||||
},
|
},
|
||||||
tokenAddress: '0x03c5F29e9296006876d8DF210BCFfD7EA5Db1Cf1',
|
'miningEnabled': true,
|
||||||
symbol: 'USDT',
|
'tokenAddress': '0xC04B0d3107736C32e19F1c62b2aF67BE61d63a05',
|
||||||
decimals: 6
|
'symbol': 'WBTC',
|
||||||
|
'decimals': 8,
|
||||||
|
'gasLimit': '85000'
|
||||||
},
|
},
|
||||||
proxy: '0x905b63Fff465B9fFBF41DeA908CEb12478ec7601',
|
proxy: '0x454d870a72e29d5e5697f635128d18077bd04c60',
|
||||||
},
|
},
|
||||||
netId42: {
|
|
||||||
eth: {
|
|
||||||
instanceAddress: {
|
|
||||||
'0.1': '0x8b3f5393bA08c24cc7ff5A66a832562aAB7bC95f',
|
|
||||||
'1': '0xD6a6AC46d02253c938B96D12BE439F570227aE8E',
|
|
||||||
'10': '0xe1BE96331391E519471100c3c1528B66B8F4e5a7',
|
|
||||||
'100': '0xd037E0Ac98Dab2fCb7E296c69C6e52767Ae5414D'
|
|
||||||
},
|
|
||||||
symbol: 'ETH',
|
|
||||||
decimals: 18
|
|
||||||
},
|
|
||||||
dai: {
|
|
||||||
instanceAddress: {
|
|
||||||
'100': '0xdf2d3cC5F361CF95b3f62c4bB66deFe3FDE47e3D',
|
|
||||||
'1000': '0xD96291dFa35d180a71964D0894a1Ae54247C4ccD',
|
|
||||||
'10000': '0xb192794f72EA45e33C3DF6fe212B9c18f6F45AE3',
|
|
||||||
'100000': undefined
|
|
||||||
},
|
|
||||||
tokenAddress: '0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa',
|
|
||||||
symbol: 'DAI',
|
|
||||||
decimals: 18
|
|
||||||
},
|
|
||||||
cdai: {
|
|
||||||
instanceAddress: {
|
|
||||||
'5000': '0x6Fc9386ABAf83147b3a89C36D422c625F44121C8',
|
|
||||||
'50000': '0x7182EA067e0f050997444FCb065985Fd677C16b6',
|
|
||||||
'500000': '0xC22ceFd90fbd1FdEeE554AE6Cc671179BC3b10Ae',
|
|
||||||
'5000000': undefined
|
|
||||||
},
|
|
||||||
tokenAddress: '0xe7bc397DBd069fC7d0109C0636d06888bb50668c',
|
|
||||||
symbol: 'cDAI',
|
|
||||||
decimals: 8
|
|
||||||
},
|
|
||||||
usdc: {
|
|
||||||
instanceAddress: {
|
|
||||||
'100': '0x137E2B6d185018e7f09f6cf175a970e7fC73826C',
|
|
||||||
'1000': '0xcC7f1633A5068E86E3830e692e3e3f8f520525Af',
|
|
||||||
'10000': '0x28C8f149a0ab8A9bdB006B8F984fFFCCE52ef5EF',
|
|
||||||
'100000': undefined
|
|
||||||
},
|
|
||||||
tokenAddress: '0x75B0622Cec14130172EaE9Cf166B92E5C112FaFF',
|
|
||||||
symbol: 'USDC',
|
|
||||||
decimals: 6
|
|
||||||
},
|
|
||||||
cusdc: {
|
|
||||||
instanceAddress: {
|
|
||||||
'5000': '0xc0648F28ABA385c8a1421Bbf1B59e3c474F89cB0',
|
|
||||||
'50000': '0x0C53853379c6b1A7B74E0A324AcbDD5Eabd4981D',
|
|
||||||
'500000': '0xf84016A0E03917cBe700D318EB1b7a53e6e3dEe1',
|
|
||||||
'5000000': undefined
|
|
||||||
},
|
|
||||||
tokenAddress: '0xcfC9bB230F00bFFDB560fCe2428b4E05F3442E35',
|
|
||||||
symbol: 'cUSDC',
|
|
||||||
decimals: 8
|
|
||||||
},
|
|
||||||
usdt: {
|
|
||||||
instanceAddress: {
|
|
||||||
'100': '0x327853Da7916a6A0935563FB1919A48843036b42',
|
|
||||||
'1000': '0x531AA4DF5858EA1d0031Dad16e3274609DE5AcC0',
|
|
||||||
'10000': '0x0958275F0362cf6f07D21373aEE0cf37dFe415dD',
|
|
||||||
'100000': '0x14aEd24B67EaF3FF28503eB92aeb217C47514364'
|
|
||||||
},
|
|
||||||
tokenAddress: '0x03c5F29e9296006876d8DF210BCFfD7EA5Db1Cf1',
|
|
||||||
symbol: 'USDT',
|
|
||||||
decimals: 6
|
|
||||||
},
|
|
||||||
proxy: '0x26Dd6E44a7090a2598e280CBD1F5E6034F2edD04',
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user