Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 23 additions & 21 deletions lib/2wp-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const {
getBtcAddressBalanceInSatoshis,
} = require('./btc-utils');
const { getBridge } = require('./bridge-provider');
const { getStorageBytesAt } = require('./rsk-rpc-utils');
const { getDerivedRSKAddressInformation } = require('@rsksmart/btc-rsk-derivation');
const btcEthUnitConverter = require('@rsksmart/btc-eth-unit-converter');
const { PEGIN_EVENTS, DEFAULT_RSK_ADDRESS_FUNDING_IN_BTC } = require('./constants/pegin-constants');
Expand Down Expand Up @@ -50,7 +51,7 @@ const assertRefundUtxosSameAsPeginUtxos = async (
refundAddress
) => {
const bridge = await getBridge(rskTxHelper.getClient());
const federationAddress = await bridge.methods.getFederationAddress().call();
const federationAddress = await bridge.getFederationAddress();
const peginTx = await btcTxHelper.getTransaction(peginTxHash);
const outputsForFederation = peginTx.outs.filter(
(output) => btcTxHelper.getOutputAddress(output.script) === federationAddress
Expand All @@ -74,26 +75,25 @@ const assertRefundUtxosSameAsPeginUtxos = async (
* @param {BN} amountInWeisBN
* @param {string} rskFromAddress
* @param {boolean} mine If true, mines 1 block after sending the transaction. If false, it will not mine the tx and will return undefined. Defaults to true.
* @returns {Promise<web3.eth.TransactionReceipt | txPromise>} the rsk tx receipt if `mine` is true, otherwise the tx promise.
* @returns {Promise<import('ethers').TransactionReceipt | string>} the rsk tx receipt if `mine` is true, otherwise the tx hash.
*/
const sendTxToBridge = async (rskTxHelper, amountInWeisBN, rskFromAddress, mine = true) => {
const txPromise = rskTxHelper.sendTransaction({
const txHash = await rskTxHelper.sendTransaction({
Comment on lines 77 to +81
from: rskFromAddress,
to: BRIDGE_ADDRESS,
value: amountInWeisBN,
gasPrice: TO_BRIDGE_GAS_PRICE,
});

if (!mine) {
return txPromise;
return txHash;
}

// Wait for the rsk tx to be in the rsk mempool before mining
await waitForRskMempoolToGetNewTxs(rskTxHelper);

await mineWithSubmitterAndSync(rskTxHelper);
const result = await txPromise;
return result;
return await rskTxHelper.getTxReceipt(txHash);
};

/**
Expand Down Expand Up @@ -125,19 +125,23 @@ const createPegoutRequest = async (rskTxHelper, amountInRBTC, requestSize = 1) =
};

const getActiveFederationUtxos = async (rskTxHelper) => {
const activeUtxosRlpEncoded = await rskTxHelper
.getClient()
.rsk.getStorageBytesAt(BRIDGE_ADDRESS, newFederationBtcUTXOSStorageIndex);
const activeUtxosRlpEncoded = await getStorageBytesAt(
rskTxHelper.getClient(),
BRIDGE_ADDRESS,
newFederationBtcUTXOSStorageIndex
);
if (activeUtxosRlpEncoded !== '0x0') {
return parseRLPToActiveFederationUtxos(activeUtxosRlpEncoded);
}
return [];
};

const getOldFederationUtxos = async (rskTxHelper) => {
const oldUtxosRlpEncoded = await rskTxHelper
.getClient()
.rsk.getStorageBytesAt(BRIDGE_ADDRESS, oldFederationBtcUTXOSStorageIndex);
const oldUtxosRlpEncoded = await getStorageBytesAt(
rskTxHelper.getClient(),
BRIDGE_ADDRESS,
oldFederationBtcUTXOSStorageIndex
);
if (oldUtxosRlpEncoded !== '0x0') {
return parseRLPToActiveFederationUtxos(oldUtxosRlpEncoded);
}
Expand Down Expand Up @@ -231,8 +235,8 @@ const sendPeginToActiveAndRetiringFederations = async (
}

const bridge = await getBridge(rskTxHelper.getClient());
const federationAddress = await bridge.methods.getFederationAddress().call();
const retiringFederationAddress = await bridge.methods.getRetiringFederationAddress().call();
const federationAddress = await bridge.getFederationAddress();
const retiringFederationAddress = await bridge.getRetiringFederationAddress();

const recipientsTransferInformation = outputAmountsInBtcForActiveFederation.map((amount) => ({
recipientAddress: federationAddress,
Expand Down Expand Up @@ -276,7 +280,7 @@ const sendPeginToActiveFederation = async (
data
) => {
const bridge = await getBridge(rskTxHelper.getClient());
const federationAddress = await bridge.methods.getFederationAddress().call();
const federationAddress = await bridge.getFederationAddress();
return await sendPegin(
rskTxHelper,
btcTxHelper,
Expand Down Expand Up @@ -305,7 +309,7 @@ const sendPeginToRetiringFederation = async (
data
) => {
const bridge = await getBridge(rskTxHelper.getClient());
const retiringFederationAddress = await bridge.methods.getRetiringFederationAddress().call();
const retiringFederationAddress = await bridge.getRetiringFederationAddress();
return await sendPegin(
rskTxHelper,
btcTxHelper,
Expand Down Expand Up @@ -350,9 +354,7 @@ const ensurePeginIsRegistered = async (rskTxHelper, peginBtcTxHash, expectedUtxo
);

const bridge = await getBridge(rskTxHelper.getClient());
const isBtcTxHashAlreadyProcessed = await bridge.methods
.isBtcTxHashAlreadyProcessed(peginBtcTxHash)
.call();
const isBtcTxHashAlreadyProcessed = await bridge.isBtcTxHashAlreadyProcessed(peginBtcTxHash);

if (utxoIsRegisteredInTheBridge && isBtcTxHashAlreadyProcessed) {
logger.debug(
Expand Down Expand Up @@ -472,8 +474,8 @@ const getBridgeUtxosBalance = async (rskTxHelper) => {
*/
const get2wpBalances = async (rskTxHelper, btcTxHelper) => {
const bridge = await getBridge(rskTxHelper.getClient());
const federationAddress = await bridge.methods.getFederationAddress().call();
const retiringFederationAddress = await bridge.methods.getRetiringFederationAddress().call();
const federationAddress = await bridge.getFederationAddress();
const retiringFederationAddress = await bridge.getRetiringFederationAddress();
const federationAddressBalanceInSatoshis = await getBtcAddressBalanceInSatoshis(
btcTxHelper,
federationAddress
Expand Down
24 changes: 17 additions & 7 deletions lib/assertions/contractMethods.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,29 @@ const chai = require('chai');
const expect = chai.expect;
chai.use(require('chai-as-promised'));

const assertContractCallReturnsWithCallback = async (methodCall, expectedCallback, options) => {
const result = await methodCall.call(options);
const assertContractCallReturnsWithCallback = async (
contract,
methodName,
methodArgs,
expectedCallback,
options
) => {
const args = options ? [...methodArgs, options] : methodArgs;
const result = await contract[methodName].staticCall(...args);
return await expectedCallback(result);
};

const assertContractCallReturns = async (methodCall, expected) => {
return assertContractCallReturnsWithCallback(methodCall, (result) =>
expect(result).to.be.eq(expected)
const assertContractCallReturns = async (contract, methodName, methodArgs, expected) => {
// `result` may be a bigint for numeric return types; stringify both sides so a string
// `expected` (the caller's usual convention) still compares correctly.
return assertContractCallReturnsWithCallback(contract, methodName, methodArgs, (result) =>
expect(result.toString()).to.be.eq(expected.toString())
);
};

const assertContractCallFails = async (methodCall, options) => {
await expect(methodCall.call(options)).to.be.rejected;
const assertContractCallFails = async (contract, methodName, methodArgs, options) => {
const args = options ? [...methodArgs, options] : methodArgs;
await expect(contract[methodName].staticCall(...args)).to.be.rejected;
};

module.exports = {
Expand Down
67 changes: 31 additions & 36 deletions lib/assertions/whitelisting.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ const assertAddOneOffWhitelistAddress = async (
) => {
const bridge = await getBridge(rskTxHelper.getClient());

const initialWhitelistSize = Number(await bridge.methods.getLockWhitelistSize().call());
const initialWhitelistSize = Number(await bridge.getLockWhitelistSize());

const unlocked = await rskUtils.getUnlockedAddress(
rskTxHelper,
Expand All @@ -49,27 +49,26 @@ const assertAddOneOffWhitelistAddress = async (

expect(unlocked).to.be.true;

const addOneOffLockWhitelistAddressMethod = bridge.methods.addOneOffLockWhitelistAddress(
btcAddress,
maxTransferValueInSatoshis
);

await rskUtils.sendTxWithCheck(
rskTxHelper,
addOneOffLockWhitelistAddressMethod,
bridge,
'addOneOffLockWhitelistAddress',
[btcAddress, maxTransferValueInSatoshis],
WHITELIST_CHANGE_ADDR,
(addResult) => expect(Number(addResult)).to.equal(1)
);

const addResult = Number(
await bridge.methods
.addOneOffLockWhitelistAddress(btcAddress, maxTransferValueInSatoshis)
.call({ from: WHITELIST_CHANGE_ADDR })
await bridge.addOneOffLockWhitelistAddress.staticCall(
btcAddress,
maxTransferValueInSatoshis,
{ from: WHITELIST_CHANGE_ADDR }
)
);

expect(addResult).to.equal(-1);

const finalLockWhitelistSize = Number(await bridge.methods.getLockWhitelistSize().call());
const finalLockWhitelistSize = Number(await bridge.getLockWhitelistSize());

expect(finalLockWhitelistSize).to.equal(initialWhitelistSize + 1);

Expand Down Expand Up @@ -101,14 +100,11 @@ const assertAddLockWhitelistAddress = async (

expect(unlocked).to.be.true;

const addLockWhitelistAddressMethod = bridge.methods.addLockWhitelistAddress(
btcAddress,
maxTransferValueInSatoshis
);

await rskUtils.sendTxWithCheck(
rskTxHelper,
addLockWhitelistAddressMethod,
bridge,
'addLockWhitelistAddress',
[btcAddress, maxTransferValueInSatoshis],
WHITELIST_CHANGE_ADDR,
(addResult) => expect(Number(addResult)).to.be.equal(1)
);
Expand All @@ -126,7 +122,7 @@ const assertAddLockWhitelistAddress = async (
const assertAddUnlimitedWhitelistAddress = async (rskTxHelper, btcAddress) => {
const bridge = await getBridge(rskTxHelper.getClient());

const initialWhitelistSize = Number(await bridge.methods.getLockWhitelistSize().call());
const initialWhitelistSize = Number(await bridge.getLockWhitelistSize());

const unlocked = await rskUtils.getUnlockedAddress(
rskTxHelper,
Expand All @@ -136,25 +132,24 @@ const assertAddUnlimitedWhitelistAddress = async (rskTxHelper, btcAddress) => {

expect(unlocked).to.be.true;

const addUnlimitedLockWhitelistAddressMethod =
bridge.methods.addUnlimitedLockWhitelistAddress(btcAddress);

await rskUtils.sendTxWithCheck(
rskTxHelper,
addUnlimitedLockWhitelistAddressMethod,
bridge,
'addUnlimitedLockWhitelistAddress',
[btcAddress],
WHITELIST_CHANGE_ADDR,
(addResult) => expect(Number(addResult)).to.equal(1)
);

const addResult = Number(
await bridge.methods
.addUnlimitedLockWhitelistAddress(btcAddress)
.call({ from: WHITELIST_CHANGE_ADDR })
await bridge.addUnlimitedLockWhitelistAddress.staticCall(btcAddress, {
from: WHITELIST_CHANGE_ADDR,
})
);

expect(addResult).to.equal(-1);

const finalWhitelistSize = Number(await bridge.methods.getLockWhitelistSize().call());
const finalWhitelistSize = Number(await bridge.getLockWhitelistSize());

expect(finalWhitelistSize).to.equal(initialWhitelistSize + 1);

Expand All @@ -171,30 +166,30 @@ const assertAddUnlimitedWhitelistAddress = async (rskTxHelper, btcAddress) => {
const assertRemoveWhitelistAddress = async (rskTxHelper, btcAddress) => {
const bridge = await getBridge(rskTxHelper.getClient());

const initialWhitelistSize = Number(await bridge.methods.getLockWhitelistSize().call());
const initialWhitelistSize = Number(await bridge.getLockWhitelistSize());

await assertWhitelistAddressPresence(rskTxHelper, btcAddress, true);

const removeLockWhitelistAddressMethod = bridge.methods.removeLockWhitelistAddress(btcAddress);

await rskUtils.sendTxWithCheck(
rskTxHelper,
removeLockWhitelistAddressMethod,
bridge,
'removeLockWhitelistAddress',
[btcAddress],
WHITELIST_CHANGE_ADDR,
(removeResult) => expect(Number(removeResult)).to.equal(1)
);

await assertWhitelistAddressPresence(rskTxHelper, btcAddress, false);

const removeResult = Number(
await bridge.methods
.removeLockWhitelistAddress(btcAddress)
.call({ from: WHITELIST_CHANGE_ADDR })
await bridge.removeLockWhitelistAddress.staticCall(btcAddress, {
from: WHITELIST_CHANGE_ADDR,
})
);

expect(removeResult).to.equal(-1);

const finalWhitelistSize = Number(await bridge.methods.getLockWhitelistSize().call());
const finalWhitelistSize = Number(await bridge.getLockWhitelistSize());

expect(finalWhitelistSize).to.equal(initialWhitelistSize - 1);
};
Expand All @@ -208,11 +203,11 @@ const assertRemoveWhitelistAddress = async (rskTxHelper, btcAddress) => {
const assertWhitelistAddressPresence = async (rskTxHelper, btcAddress, present) => {
const bridge = await getBridge(rskTxHelper.getClient());

const whitelistSize = Number(await bridge.methods.getLockWhitelistSize().call());
const whitelistSize = Number(await bridge.getLockWhitelistSize());

const isPresentFromIndex = async (addressToSearch, size, index) => {
for (let i = index; i < size; i++) {
const returnedAddress = await bridge.methods.getLockWhitelistAddress(i).call();
const returnedAddress = await bridge.getLockWhitelistAddress(i);
if (returnedAddress === addressToSearch) {
return true;
}
Expand Down
10 changes: 6 additions & 4 deletions lib/bridge-provider.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
const { ethers } = require('ethers');
const precompiledAbis = require('@rsksmart/rsk-precompiled-abis');

/**
* Returns a new bridge.
* @param {Web3} rskClient
* @returns {Bridge}
* @param {import('ethers').JsonRpcProvider} rskClient
* @returns {import('ethers').Contract} Bridge
*/
const getBridge = async (rskClient) => {
return new rskClient.eth.Contract(
return new ethers.Contract(
precompiledAbis.bridge.address,
precompiledAbis.bridge.abi,
precompiledAbis.bridge.address
rskClient
);
};

Expand Down
Loading
Loading