Update SAI handling in monitor after ES (#331)
This commit is contained in:
parent
2369e876aa
commit
84508e2b84
@ -3,7 +3,6 @@ const BN = require('bignumber.js')
|
|||||||
const Web3 = require('web3')
|
const Web3 = require('web3')
|
||||||
const logger = require('./logger')('getBalances')
|
const logger = require('./logger')('getBalances')
|
||||||
const { BRIDGE_MODES } = require('../commons')
|
const { BRIDGE_MODES } = require('../commons')
|
||||||
const { blockNumberHalfDuplexDisabled } = require('./utils/tokenUtils')
|
|
||||||
|
|
||||||
const Web3Utils = Web3.utils
|
const Web3Utils = Web3.utils
|
||||||
|
|
||||||
@ -86,28 +85,7 @@ async function main(bridgeMode) {
|
|||||||
const erc20Contract = new web3Foreign.eth.Contract(ERC20_ABI, erc20Address)
|
const erc20Contract = new web3Foreign.eth.Contract(ERC20_ABI, erc20Address)
|
||||||
let investedAmountInDai = 0
|
let investedAmountInDai = 0
|
||||||
let bridgeDsrBalance = 0
|
let bridgeDsrBalance = 0
|
||||||
let foreignHalfDuplexErc20Balance = 0
|
|
||||||
let displayChaiToken = false
|
let displayChaiToken = false
|
||||||
let displayHalfDuplexToken = false
|
|
||||||
let tokenSwapAllowed = false
|
|
||||||
try {
|
|
||||||
const halfDuplexTokenAddress = await foreignBridge.methods.halfDuplexErc20token().call()
|
|
||||||
if (halfDuplexTokenAddress !== erc20Address) {
|
|
||||||
const halfDuplexToken = new web3Foreign.eth.Contract(ERC20_ABI, halfDuplexTokenAddress)
|
|
||||||
logger.debug('calling halfDuplexToken.methods.balanceOf')
|
|
||||||
foreignHalfDuplexErc20Balance = await halfDuplexToken.methods
|
|
||||||
.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS)
|
|
||||||
.call(null, blockNumberHalfDuplexDisabled)
|
|
||||||
logger.debug('getting last block numbers')
|
|
||||||
const block = await web3Foreign.eth.getBlock('latest')
|
|
||||||
|
|
||||||
logger.debug(`Checking if SCD Emergency Shutdown has happened`)
|
|
||||||
tokenSwapAllowed = await foreignBridge.methods.isTokenSwapAllowed(block.timestamp).call()
|
|
||||||
displayHalfDuplexToken = true
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
logger.debug('Methods for half duplex token are not present')
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
logger.debug('calling foreignBridge.methods.isChaiTokenEnabled')
|
logger.debug('calling foreignBridge.methods.isChaiTokenEnabled')
|
||||||
@ -142,30 +120,16 @@ async function main(bridgeMode) {
|
|||||||
const foreignErc20BalanceBN = new BN(foreignErc20Balance)
|
const foreignErc20BalanceBN = new BN(foreignErc20Balance)
|
||||||
const investedAmountInDaiBN = new BN(investedAmountInDai)
|
const investedAmountInDaiBN = new BN(investedAmountInDai)
|
||||||
const bridgeDsrBalanceBN = new BN(bridgeDsrBalance)
|
const bridgeDsrBalanceBN = new BN(bridgeDsrBalance)
|
||||||
const halfDuplexErc20BalanceBN = displayHalfDuplexToken ? new BN(foreignHalfDuplexErc20Balance) : new BN(0)
|
|
||||||
|
|
||||||
const diff = foreignErc20BalanceBN
|
const diff = foreignErc20BalanceBN
|
||||||
.plus(halfDuplexErc20BalanceBN)
|
|
||||||
.plus(investedAmountInDaiBN)
|
.plus(investedAmountInDaiBN)
|
||||||
.minus(totalSupplyBN)
|
.minus(totalSupplyBN)
|
||||||
.toFixed()
|
.toFixed()
|
||||||
|
|
||||||
let foreign = {
|
const foreign = {
|
||||||
erc20Balance: Web3Utils.fromWei(foreignErc20Balance)
|
erc20Balance: Web3Utils.fromWei(foreignErc20Balance)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (displayHalfDuplexToken && tokenSwapAllowed) {
|
|
||||||
foreign = {
|
|
||||||
...foreign,
|
|
||||||
halfDuplexErc20Balance: Web3Utils.fromWei(foreignHalfDuplexErc20Balance)
|
|
||||||
}
|
|
||||||
} else if (displayHalfDuplexToken && !tokenSwapAllowed) {
|
|
||||||
foreign = {
|
|
||||||
...foreign,
|
|
||||||
halfDuplexErc20BalanceAfterES: Web3Utils.fromWei(foreignHalfDuplexErc20Balance)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (displayChaiToken) {
|
if (displayChaiToken) {
|
||||||
foreign.investedErc20Balance = Web3Utils.fromWei(investedAmountInDai)
|
foreign.investedErc20Balance = Web3Utils.fromWei(investedAmountInDai)
|
||||||
foreign.accumulatedInterest = Web3Utils.fromWei(bridgeDsrBalanceBN.minus(investedAmountInDaiBN).toString(10))
|
foreign.accumulatedInterest = Web3Utils.fromWei(bridgeDsrBalanceBN.minus(investedAmountInDaiBN).toString(10))
|
||||||
|
@ -11,11 +11,9 @@ const {
|
|||||||
ERC20_ABI,
|
ERC20_ABI,
|
||||||
ERC677_BRIDGE_TOKEN_ABI,
|
ERC677_BRIDGE_TOKEN_ABI,
|
||||||
getTokenType,
|
getTokenType,
|
||||||
getPastEvents,
|
getPastEvents
|
||||||
ZERO_ADDRESS
|
|
||||||
} = require('../../commons')
|
} = require('../../commons')
|
||||||
const { normalizeEventInformation } = require('./message')
|
const { normalizeEventInformation } = require('./message')
|
||||||
const { filterTransferBeforeES } = require('./tokenUtils')
|
|
||||||
const { writeFile, readCacheFile } = require('./file')
|
const { writeFile, readCacheFile } = require('./file')
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@ -111,74 +109,12 @@ async function main(mode) {
|
|||||||
}
|
}
|
||||||
})).map(normalizeEvent)
|
})).map(normalizeEvent)
|
||||||
|
|
||||||
let directTransfers = transferEvents
|
|
||||||
const tokensSwappedAbiExists = FOREIGN_ABI.filter(e => e.type === 'event' && e.name === 'TokensSwapped')[0]
|
|
||||||
if (tokensSwappedAbiExists) {
|
|
||||||
const tokensSwappedEvents = await getPastEvents(foreignBridge, {
|
|
||||||
event: 'TokensSwapped',
|
|
||||||
fromBlock: MONITOR_FOREIGN_START_BLOCK,
|
|
||||||
toBlock: foreignBlockNumber
|
|
||||||
})
|
|
||||||
|
|
||||||
// Get token swap events emitted by foreign bridge
|
|
||||||
const bridgeTokensSwappedEvents = tokensSwappedEvents.filter(e => e.address === COMMON_FOREIGN_BRIDGE_ADDRESS)
|
|
||||||
|
|
||||||
// Get transfer events for each previous erc20
|
|
||||||
const uniqueTokenAddressesSet = new Set(bridgeTokensSwappedEvents.map(e => e.returnValues.from))
|
|
||||||
|
|
||||||
// Exclude chai token from previous erc20
|
|
||||||
try {
|
|
||||||
logger.debug('calling foreignBridge.chaiToken()')
|
|
||||||
const chaiToken = await foreignBridge.methods.chaiToken().call()
|
|
||||||
uniqueTokenAddressesSet.delete(chaiToken)
|
|
||||||
} catch (e) {
|
|
||||||
logger.debug('call to foreignBridge.chaiToken() failed')
|
|
||||||
}
|
|
||||||
// Exclude dai token from previous erc20
|
|
||||||
try {
|
|
||||||
logger.debug('calling foreignBridge.erc20token()')
|
|
||||||
const daiToken = await foreignBridge.methods.erc20token().call()
|
|
||||||
uniqueTokenAddressesSet.delete(daiToken)
|
|
||||||
} catch (e) {
|
|
||||||
logger.debug('call to foreignBridge.erc20token() failed')
|
|
||||||
}
|
|
||||||
|
|
||||||
const uniqueTokenAddresses = [...uniqueTokenAddressesSet]
|
|
||||||
await Promise.all(
|
|
||||||
uniqueTokenAddresses.map(async tokenAddress => {
|
|
||||||
const halfDuplexTokenContract = new web3Foreign.eth.Contract(ERC20_ABI, tokenAddress)
|
|
||||||
|
|
||||||
const halfDuplexTransferEvents = (await getPastEvents(halfDuplexTokenContract, {
|
|
||||||
event: 'Transfer',
|
|
||||||
fromBlock: MONITOR_FOREIGN_START_BLOCK,
|
|
||||||
toBlock: foreignBlockNumber,
|
|
||||||
options: {
|
|
||||||
filter: { to: COMMON_FOREIGN_BRIDGE_ADDRESS }
|
|
||||||
}
|
|
||||||
})).map(normalizeEvent)
|
|
||||||
|
|
||||||
// Remove events after the ES
|
|
||||||
const validHalfDuplexTransfers = await filterTransferBeforeES(halfDuplexTransferEvents)
|
|
||||||
|
|
||||||
transferEvents = [...validHalfDuplexTransfers, ...transferEvents]
|
|
||||||
})
|
|
||||||
)
|
|
||||||
|
|
||||||
// filter transfer that is part of a token swap
|
|
||||||
directTransfers = transferEvents.filter(
|
|
||||||
e =>
|
|
||||||
bridgeTokensSwappedEvents.findIndex(
|
|
||||||
t => t.transactionHash === e.referenceTx && e.recipient === ZERO_ADDRESS
|
|
||||||
) === -1
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get transfer events that didn't have a UserRequestForAffirmation event in the same transaction
|
// Get transfer events that didn't have a UserRequestForAffirmation event in the same transaction
|
||||||
directTransfers = directTransfers.filter(
|
transferEvents = transferEvents.filter(
|
||||||
e => foreignToHomeRequests.findIndex(t => t.referenceTx === e.referenceTx) === -1
|
e => foreignToHomeRequests.findIndex(t => t.referenceTx === e.referenceTx) === -1
|
||||||
)
|
)
|
||||||
|
|
||||||
foreignToHomeRequests = [...foreignToHomeRequests, ...directTransfers]
|
foreignToHomeRequests = [...foreignToHomeRequests, ...transferEvents]
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.debug('Done')
|
logger.debug('Done')
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
// https://etherscan.io/tx/0xd0c3c92c94e05bc71256055ce8c4c993e047f04e04f3283a04e4cb077b71f6c6
|
|
||||||
const blockNumberHalfDuplexDisabled = 9884448
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the event was before the bridge stopped supporting half duplex transfers.
|
|
||||||
*/
|
|
||||||
async function transferBeforeES(event) {
|
|
||||||
return event.blockNumber < blockNumberHalfDuplexDisabled
|
|
||||||
}
|
|
||||||
|
|
||||||
async function filterTransferBeforeES(array) {
|
|
||||||
const newArray = []
|
|
||||||
// Iterate events from newer to older
|
|
||||||
for (let i = array.length - 1; i >= 0; i--) {
|
|
||||||
const beforeES = await transferBeforeES(array[i])
|
|
||||||
if (beforeES) {
|
|
||||||
// add element to first position so the new array will have the same order
|
|
||||||
newArray.unshift(array[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return newArray
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
filterTransferBeforeES,
|
|
||||||
blockNumberHalfDuplexDisabled
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user