Add method for handling imbalance in SAI tokens (#419)

This commit is contained in:
Kirill Fedoseev 2020-05-12 20:14:55 +03:00 committed by GitHub
parent e550067c76
commit cfcc717b02
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 57 additions and 7 deletions

View File

@ -8,6 +8,7 @@ import "../ChaiConnector.sol";
contract ForeignBridgeErcToNative is BasicForeignBridge, ERC20Bridge, OtherSideBridgeStorage, ChaiConnector {
bytes32 internal constant MIN_HDTOKEN_BALANCE = 0x48649cf195feb695632309f41e61252b09f537943654bde13eb7bb1bca06964e; // keccak256(abi.encodePacked("minHDTokenBalance"))
bytes32 internal constant LOCKED_SAI_FIXED = 0xbeb8b2ece34b32b36c9cc00744143b61b2c23f93adcc3ce78d38937229423051; // keccak256(abi.encodePacked("lockedSaiFixed"))
bytes4 internal constant SWAP_TOKENS = 0x73d00224; // swapTokens()
function initialize(
@ -61,6 +62,14 @@ contract ForeignBridgeErcToNative is BasicForeignBridge, ERC20Bridge, OtherSideB
return 0x18762d46; // bytes4(keccak256(abi.encodePacked("erc-to-native-core")))
}
function fixLockedSai(address _receiver) external {
require(msg.sender == address(this));
require(!boolStorage[LOCKED_SAI_FIXED]);
boolStorage[LOCKED_SAI_FIXED] = true;
setInvestedAmountInDai(investedAmountInDai() + 49938645266079271041);
claimValues(halfDuplexErc20token(), _receiver);
}
function claimTokens(address _token, address _to) public {
require(_token != address(erc20token()));
// Chai token is not claimable if investing into Chai is enabled

View File

@ -2201,5 +2201,40 @@ contract('ForeignBridge_ERC20_to_Native', async accounts => {
}
})
})
describe('fixLockedSai', async () => {
it('should fix 49.938645266079271041 locked sai tokens', async () => {
const foreignBridgeProxy = await EternalStorageProxy.new().should.be.fulfilled
await foreignBridgeProxy.upgradeTo('1', foreignBridge.address).should.be.fulfilled
foreignBridge = await ForeignBridge.at(foreignBridgeProxy.address)
await foreignBridge.initialize(
validatorContract.address,
token.address,
requireBlockConfirmations,
gasPrice,
[dailyLimit, maxPerTx, minPerTx],
[homeDailyLimit, homeMaxPerTx],
owner,
decimalShiftZero,
otherSideBridge.address
).should.be.fulfilled
await sai.mint(foreignBridge.address, 100)
const foreignBridge2 = await ForeignBridgeErcToNativeMock.new()
const foreignBridge3 = await ForeignBridgeErcToNativeMock.new()
const data = foreignBridge.contract.methods.fixLockedSai(accounts[9]).encodeABI()
await foreignBridgeProxy.upgradeToAndCall('2', foreignBridge2.address, data).should.be.fulfilled
await sai.mint(foreignBridge.address, 100)
await foreignBridgeProxy.upgradeToAndCall('3', foreignBridge3.address, data).should.be.rejected
expect(await sai.balanceOf(accounts[9])).to.be.bignumber.equal('100')
expect(await foreignBridge.investedAmountInDai()).to.be.bignumber.equal('49938645266079271041')
})
})
})
})

View File

@ -1,6 +1,6 @@
FOREIGN_RPC_URL=https://mainnet.infura.io/v3/API_KEY
FOREIGN_PRIVKEY=0x...
FOREING_BRIDGE_ADDRESS=0x4aa42145Aa6Ebf72e164C9bBC74fbD3788045016
FOREIGN_BRIDGE_ADDRESS=0x4aa42145Aa6Ebf72e164C9bBC74fbD3788045016
FOREIGN_START_BLOCK=9122083
FOREIGN_GAS_PRICE=1000000000
@ -8,3 +8,4 @@ FOREIGN_GAS_PRICE=1000000000
ROLE=confirm
NEW_IMPLEMENTATION_ETH_BRIDGE=
SAI_TOKENS_RECEIVER=

View File

@ -2,17 +2,19 @@ require('dotenv').config()
const Web3 = require('web3')
const multiSigWalletAbi = require('../abi/multiSigwallet')
const proxyAbi = require('../../build/contracts/EternalStorageProxy').abi
const bridgeAbi = require('../../build/contracts/ForeignBridgeErcToNative').abi
const callMultiSigWallet = require('./utils/callMultiSigWallet')
const validatorState = require('./utils/validatorState')
const {
FOREIGN_PRIVKEY,
FOREIGN_RPC_URL,
FOREING_BRIDGE_ADDRESS,
FOREIGN_BRIDGE_ADDRESS,
ROLE,
FOREIGN_START_BLOCK,
FOREIGN_GAS_PRICE,
NEW_IMPLEMENTATION_ETH_BRIDGE
NEW_IMPLEMENTATION_ETH_BRIDGE,
SAI_TOKENS_RECEIVER
} = process.env
const web3 = new Web3(new Web3.providers.HttpProvider(FOREIGN_RPC_URL))
@ -20,18 +22,21 @@ const { address } = web3.eth.accounts.wallet.add(FOREIGN_PRIVKEY)
const upgradeBridgeOnForeign = async () => {
try {
const proxy = new web3.eth.Contract(proxyAbi, FOREING_BRIDGE_ADDRESS)
const proxy = new web3.eth.Contract(proxyAbi, FOREIGN_BRIDGE_ADDRESS)
const foreignBridge = new web3.eth.Contract(bridgeAbi, FOREIGN_BRIDGE_ADDRESS)
const ownerAddress = await proxy.methods.upgradeabilityOwner().call()
const multiSigWallet = new web3.eth.Contract(multiSigWalletAbi, ownerAddress)
await validatorState(web3, address, multiSigWallet)
const data = proxy.methods.upgradeTo('5', NEW_IMPLEMENTATION_ETH_BRIDGE).encodeABI()
const fixData = foreignBridge.methods.fixLockedSai(SAI_TOKENS_RECEIVER).encodeABI()
const data = proxy.methods.upgradeToAndCall('6', NEW_IMPLEMENTATION_ETH_BRIDGE, fixData).encodeABI()
await callMultiSigWallet({
role: ROLE,
contract: multiSigWallet,
destination: FOREING_BRIDGE_ADDRESS,
destination: FOREIGN_BRIDGE_ADDRESS,
fromBlock: FOREIGN_START_BLOCK,
gasPrice: FOREIGN_GAS_PRICE,
address,

View File

@ -51,7 +51,7 @@ const callMultiSigWallet = async ({ role, contract, destination, fromBlock, gasP
const gas = await contract.methods.submitTransaction(destination, 0, data).estimateGas({ from: address })
const receipt = await contract.methods
.submitTransaction(destination, 0, data)
.send({ from: address, gas, gasPrice })
.send({ from: address, gas: addExtraGas(gas), gasPrice })
console.log(`Submission status: ${receipt.status} - Tx Hash: ${receipt.transactionHash}`)
} else {
await confirmTransaction({