Add method for handling imbalance in SAI tokens (#419)
This commit is contained in:
parent
e550067c76
commit
cfcc717b02
|
@ -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
|
||||
|
|
|
@ -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')
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
|
@ -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=
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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({
|
||||
|
|
Loading…
Reference in New Issue