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
|
||||||
```
|
```
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
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