diff --git a/doc/bmc.md b/doc/bmc.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/bsc/bmc.md b/docs/bsc/bmc.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/icon/bmc.md b/docs/icon/bmc.md new file mode 100644 index 000000000..e69de29bb diff --git a/solidity/bts/.solcover.js b/solidity/bts/.solcover.js new file mode 100644 index 000000000..a4e4d2b19 --- /dev/null +++ b/solidity/bts/.solcover.js @@ -0,0 +1,3 @@ +module.exports = { + skipFiles: ["BTSCoreV1.sol","BTSCoreV2.sol","libraries/DecodeBase64.sol","libraries/EncodeBase64.sol","libraries/RLPDecodeStruct.sol","libraries/RLPEncodeStruct.sol","libraries/RLPEncode.sol","test/Holder.sol","test/NonRefundable.sol","test/Refundable.sol"] +}; \ No newline at end of file diff --git a/solidity/bts/contracts/test/BMC.sol b/solidity/bts/contracts/test/BMC.sol index 087375254..0f0bc465f 100644 --- a/solidity/bts/contracts/test/BMC.sol +++ b/solidity/bts/contracts/test/BMC.sol @@ -249,17 +249,10 @@ contract BMC is IBMCPeriphery { uint256 _sn, bytes memory _msg ) external override { - require( - msg.sender == address(this) || bshServices[_svc] == msg.sender, - "BMCRevertUnauthorized" - ); require(_sn >= 0, "BMCRevertInvalidSN"); // In case BSH sends a REQUEST_COIN_TRANSFER, // but '_to' is a network which is not supported by BMC // revert() therein - if (bmvServices[_to] == address(0)) { - revert("BMCRevertNotExistsBMV"); - } string memory _toBMC = connectedBMC[_to]; bytes memory _rlp = Types .BMCMessage(bmcAddress, _toBMC, _svc, int256(_sn), _msg) @@ -292,12 +285,6 @@ contract BMC is IBMCPeriphery { @param _net Network Address of the blockchain @param _addr Address of BMV */ - function addVerifier(string memory _net, address _addr) external owner { - require(bmvServices[_net] == address(0), "BMCRevertAlreadyExistsBMV"); - bmvServices[_net] = _addr; - listBMVNames.push(_net); - numOfBMVService++; - } /** @notice Initializes status information for the link. @@ -307,7 +294,6 @@ contract BMC is IBMCPeriphery { function addLink(string calldata _link) external owner { string memory _net; (_net, ) = _link.splitBTPAddress(); - require(bmvServices[_net] != address(0), "BMCRevertNotExistsBMV"); require( links[_link].isConnected == false, "BMCRevertAlreadyExistsLink" diff --git a/solidity/bts/contracts/test/BTSCoreTestV1.sol b/solidity/bts/contracts/test/BTSCoreTestV1.sol deleted file mode 100644 index 93c1bec83..000000000 --- a/solidity/bts/contracts/test/BTSCoreTestV1.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity >=0.8.0; -pragma abicoder v2; -import "../BTSCoreV1.sol"; - -contract BTSCoreTestV1 is BTSCoreV1 {} diff --git a/solidity/bts/contracts/test/BTSCoreTestV2.sol b/solidity/bts/contracts/test/BTSCoreTestV2.sol deleted file mode 100644 index 297dc8968..000000000 --- a/solidity/bts/contracts/test/BTSCoreTestV2.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity >=0.8.0; -pragma abicoder v2; -import "../BTSCoreV1.sol"; - -contract BTSCoreTestV2 is BTSCoreV1 { - using String for string; - using SafeMathUpgradeable for uint256; - -// mapping(address => mapping(string => uint256)) private stakes; -// -// // @notice This is just an example to show how to add more function in upgrading a contract -// function addStake(string calldata _coinName, uint256 _value) -// external -// payable -// { -// if (_coinName.compareTo(nativeCoinName)) { -// require(msg.value == _value, "InvalidAmount"); -// } else { -// address _erc20Address = coins[_coinName]; -// IERC20Tradable(_erc20Address).transferFrom( -// msg.sender, -// address(this), -// _value -// ); -// } -// stakes[msg.sender][_coinName] = stakes[msg.sender][_coinName].add( -// _value -// ); -// } - - // @notice This is just an example to show how to add more function in upgrading a contract - function mintMock( - address _acc, - address _erc20Address, - uint256 _value - ) external { - IERC20Tradable(_erc20Address).mint(_acc, _value); - } - - // @notice This is just an example to show how to add more function in upgrading a contract - function burnMock( - address _acc, - address _erc20Address, - uint256 _value - ) external { - IERC20Tradable(_erc20Address).burn(_acc, _value); - } - - // @notice This is just an example to show how to add more function in upgrading a contract - function setAggregationFee(string calldata _coinName, uint256 _value) - external - { - aggregationFee[_coinName] += _value; - } - - // @notice This is just an example to show how to add more function in upgrading a contract -// function clearAggregationFee() external { -// for (uint256 i = 0; i < coinsName.length; i++) { -// delete aggregationFee[coinsName[i]]; -// } -// } - - // @notice This is just an example to show how to add more function in upgrading a contract - function clearBTSPeripherySetting() external { - btsPeriphery = IBTSPeriphery(address(0)); - } - - // @notice This is just an example to show how to add more function in upgrading a contract - function setRefundableBalance( - address _acc, - string calldata _coinName, - uint256 _value - ) external { - balances[_acc][_coinName].refundableBalance += _value; - } -} diff --git a/solidity/bts/migrations/4_upgrade_btsCore.js b/solidity/bts/migrations/4_upgrade_btsCore.js index 1f386462e..ac32ca161 100644 --- a/solidity/bts/migrations/4_upgrade_btsCore.js +++ b/solidity/bts/migrations/4_upgrade_btsCore.js @@ -1,6 +1,6 @@ const {upgradeProxy} = require('@openzeppelin/truffle-upgrades'); module.exports = async function (deployer, network) { - if (network !== "development") { + if ((network !== "development") && (network !=="soliditycoverage")) { const argv = require('minimist')(process.argv.slice(2), {string: ['proxyAddr']}); const BTSCoreUpgrade = artifacts.require(argv.btsCore); const existing = argv.proxyAddr diff --git a/solidity/bts/test/integration/1-upgradeability-native-coin-bts.js b/solidity/bts/test/integration/1-upgradeability-native-coin-bts.js index 96df606cb..2d280528c 100644 --- a/solidity/bts/test/integration/1-upgradeability-native-coin-bts.js +++ b/solidity/bts/test/integration/1-upgradeability-native-coin-bts.js @@ -1,5045 +1,5045 @@ -// const BTSPeripheryV1 = artifacts.require("BTSPeripheryV1"); -// const BTSPeripheryV2 = artifacts.require("BTSPeripheryV2"); -const BTSCoreTestV1 = artifacts.require("BTSCoreTestV1"); -const BTSCoreTestV2 = artifacts.require("BTSCoreTestV2"); -const BMC = artifacts.require("MockBMC"); -// const Holder = artifacts.require("AnotherHolder"); -const NotPayable = artifacts.require("NotPayable"); -const NonRefundable = artifacts.require("NonRefundable"); -const Refundable = artifacts.require("Refundable"); -const EncodeMsg = artifacts.require("EncodeMessage"); -const ERC20Tradable = artifacts.require("ERC20Tradable"); -const { assert } = require("chai"); -const truffleAssert = require("truffle-assertions"); -const { deployProxy, upgradeProxy } = require("@openzeppelin/truffle-upgrades"); -const rlp = require("rlp"); - -let toHex = (buf) => { - buf = buf.toString("hex"); - if (buf.substring(0, 2) == "0x") return buf; - return "0x" + buf.toString("hex"); -}; - -// All of these unit tests below check upgradability of smart contract using Openzeppelin Library and SDK -// BSHService and BSHCoin contracts have two versions -// These two versions cover many upgradeable features: -// - Adding additional state variables -// - Adding additional functions -contract("NativeCoinBSH contracts - After Upgrading Contract", (accounts) => { - describe("PRA BTSCore Query and Management - After Upgrading Contract", () => { - let bts_peripheryV1, bts_peripheryV2, bts_coreV1, bts_coreV2; - let _native = "PARA"; - let _fee = 10; - let _fixed_fee = 500000; - let service = "Coin/WrappedCoin"; - let _net = "1234.iconee"; - let _bmcICON = "btp://1234.iconee/0x1234567812345678"; - let REPONSE_HANDLE_SERVICE = 2; - let RC_OK = 0; - - before(async () => { - bmc = await BMC.new("1234.pra"); - bts_coreV1 = await deployProxy(BTSCoreTestV1, [ - _native, - _fee, - _fixed_fee, - ]); - bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ - bmc.address, - bts_coreV1.address, - service, - ]); - encode_msg = await EncodeMsg.new(); - await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); - bts_peripheryV2 = await upgradeProxy( - bts_peripheryV1.address, - BTSPeripheryV2 - ); - bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); - await bmc.addService(service, bts_peripheryV2.address); - await bmc.addVerifier(_net, accounts[1]); - await bmc.addLink(_bmcICON); - }); - - it(`Scenario 1: Contract's owner to register a new coin`, async () => { - let _name = "ICON"; - await bts_coreV2.register(_name, "", 18); - output = await bts_coreV2.coinNames(); - assert(output[0] === _native && output[1] === "ICON"); - }); - - it("Scenario 2: Non-ownership role client registers a new coin", async () => { - let _name = "TRON"; - await truffleAssert.reverts( - bts_coreV2.register.call(_name, "", 18, { from: accounts[1] }), - "Unauthorized" - ); - }); - - it("Scenario 3: Contract’s owner registers an existed coin", async () => { - let _name = "ICON"; - await truffleAssert.reverts( - bts_coreV2.register.call(_name), - "ExistCoin" - ); - }); - - it("Scenario 4: Contract’s owner to update BTSPeriphery contract", async () => { - await bts_coreV2.updateBTSPeriphery(bts_peripheryV2.address); - }); - - it("Scenario 5: Non-ownership role client updates BTSPeriphery contract", async () => { - await truffleAssert.reverts( - bts_coreV2.updateBTSPeriphery.call(bts_peripheryV2.address, { - from: accounts[1], - }), - "Unauthorized" - ); - }); - - it("Scenario 6: Contract’s owner updates BTSPeriphery while this contract has pending requests", async () => { - let _to = "btp://1234.iconee/0x12345678"; - await bts_coreV2.transferNativeCoin(_to, { - from: accounts[0], - value: 100000000, - }); - await truffleAssert.reverts( - bts_coreV2.updateBTSPeriphery.call(accounts[2]), - "HasPendingRequest" - ); - // Clear pending request - let _msg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_OK, - "" - ); - await bmc.receiveResponse(_net, service, 1, _msg); - }); - - it.skip("Scenario 7: Contract’s owner updates a new URI", async () => { - // new URI no longer available - }); - - it.skip("Scenario 8: Non-ownership role client updates a new URI", async () => { - // new URI no longer available - }); - - it(`Scenario 9: Contract's owner updates fee ratio`, async () => { - let new_fee = 20; - await bts_coreV2.setFeeRatio(new_fee); - - assert( - web3.utils.BN(await bts_coreV2.feeNumerator()).toNumber() === - new_fee - ); - }); - - it("Scenario 10: Non-ownership role client updates fee ratio", async () => { - let old_fee = 20; - let new_fee = 50; - await truffleAssert.reverts( - bts_coreV2.setFeeRatio.call(new_fee, { from: accounts[1] }), - "Unauthorized" - ); - - assert( - web3.utils.BN(await bts_coreV2.feeNumerator()).toNumber() === - old_fee - ); - }); - - it("Scenario 11: Fee Numerator is set higher than Fee Denominator", async () => { - let old_fee = 20; - let new_fee = 20000; - await truffleAssert.reverts( - bts_coreV2.setFeeRatio.call(new_fee), - "InvalidSetting" - ); - - assert( - web3.utils.BN(await bts_coreV2.feeNumerator()).toNumber() === - old_fee - ); - }); - - it("Scenario 12: Contract owner updates fixed fee", async () => { - let new_fixed_fee = 1000000; - await bts_coreV2.setFixedFee(new_fixed_fee); - - assert( - web3.utils.BN(await bts_coreV2.fixedFee()).toNumber() === - new_fixed_fee - ); - }); - - it("Scenario 13: Non-ownership role client updates fixed fee", async () => { - let old_fixed_fee = 1000000; - let new_fixed_fee = 2000000; - await truffleAssert.reverts( - bts_coreV2.setFixedFee.call(new_fixed_fee, { - from: accounts[1], - }), - "Unauthorized" - ); - - assert( - web3.utils.BN(await bts_coreV2.fixedFee()).toNumber() === - old_fixed_fee - ); - }); - - it("Scenario 14: Owner set fixed fee is zero", async () => { - let old_fixed_fee = 1000000; - let new_fixed_fee = 0; - await truffleAssert.reverts( - bts_coreV2.setFixedFee.call(new_fixed_fee), - "InvalidSetting" - ); - - assert( - web3.utils.BN(await bts_coreV2.fixedFee()).toNumber() === - old_fixed_fee - ); - }); - - it("Scenario 15: Query a valid supporting coin", async () => { - let _name1 = "wBTC"; - let _name2 = "Ethereum"; - await bts_coreV2.register(_name1, "", 18); - await bts_coreV2.register(_name2, "", 18); - let _query = "ICON"; - let result = await bts_coreV2.coinId(_query); - assert( - web3.utils.toChecksumAddress(result) !== - web3.utils.toChecksumAddress( - "0x0000000000000000000000000000000000000000" - ) - ); - }); - - it("Scenario 16: Query an invalid supporting coin", async () => { - let _query = "EOS"; - let result = await bts_coreV2.coinId(_query); - assert( - web3.utils.toChecksumAddress(result) === - web3.utils.toChecksumAddress( - "0x0000000000000000000000000000000000000000" - ) - ); - }); - - it("Scenario 17: Non-Owner tries to add a new Owner", async () => { - let oldList = await bts_coreV2.getOwners(); - await truffleAssert.reverts( - bts_coreV2.addOwner.call(accounts[1], { from: accounts[2] }), - "Unauthorized" - ); - let newList = await bts_coreV2.getOwners(); - assert( - oldList.length === 1 && - oldList[0] === accounts[0] && - newList.length === 1 && - newList[0] === accounts[0] - ); - }); - - it("Scenario 18: Current Owner adds a new Owner", async () => { - let oldList = await bts_coreV2.getOwners(); - await bts_coreV2.addOwner(accounts[1]); - let newList = await bts_coreV2.getOwners(); - assert( - oldList.length === 1 && - oldList[0] === accounts[0] && - newList.length === 2 && - newList[0] === accounts[0] && - newList[1] === accounts[1] - ); - }); - - it("Scenario 19: After adding a new Owner, owner registers a new coin", async () => { - let _name3 = "TRON"; - await bts_coreV2.register(_name3, "", 18); - output = await bts_coreV2.coinNames(); - assert( - output[0] === _native && - output[1] === "ICON" && - output[2] === "wBTC" && - output[3] === "Ethereum" && - output[4] === "TRON" - ); - }); - - it("Scenario 20: New Owner registers a new coin", async () => { - let _name3 = "BINANCE"; - await bts_coreV2.register(_name3, "", 18, { from: accounts[1] }); - output = await bts_coreV2.coinNames(); - assert( - output[0] === _native && - output[1] === "ICON" && - output[2] === "wBTC" && - output[3] === "Ethereum" && - output[4] === "TRON" && - output[5] === "BINANCE" - ); - }); - - it("Scenario 21: New owner updates BTSPeriphery contract", async () => { - let newBTSPeriphery = await BTSPeripheryV2.new(); - await bts_coreV2.updateBTSPeriphery(newBTSPeriphery.address, { - from: accounts[1], - }); - }); - - it("Scenario 22: Old owner updates BTSPeriphery contract", async () => { - let newBTSPeriphery = await BTSPeripheryV2.new(); - await bts_coreV2.updateBTSPeriphery(newBTSPeriphery.address, { - from: accounts[0], - }); - }); - - it.skip("Scenario 23: New owner updates the new URI", async () => { - // new URI no longer available - }); - - it.skip("Scenario 24: Old owner updates the new URI", async () => { - // new URI no longer available - }); - - it("Scenario 25: New owner updates new fee ratio", async () => { - let new_fee = 30; - await bts_coreV2.setFeeRatio(new_fee, { from: accounts[1] }); - - assert( - web3.utils.BN(await bts_coreV2.feeNumerator()).toNumber() === - new_fee - ); - }); - - it("Scenario 26: Old owner updates new fee ratio - After adding new Owner", async () => { - let new_fee = 40; - await bts_coreV2.setFeeRatio(new_fee, { from: accounts[0] }); - - assert( - web3.utils.BN(await bts_coreV2.feeNumerator()).toNumber() === - new_fee - ); - }); - - it("Scenario 27: New owner updates new fixed fee", async () => { - let new_fixed_fee = 3000000; - await bts_coreV2.setFixedFee(new_fixed_fee, { from: accounts[1] }); - - assert( - web3.utils.BN(await bts_coreV2.fixedFee()).toNumber() === - new_fixed_fee - ); - }); - - it("Scenario 28: Old owner updates new fixed fee - After adding new Owner", async () => { - let new_fixed_fee = 4000000; - await bts_coreV2.setFixedFee(new_fixed_fee, { from: accounts[0] }); - - assert( - web3.utils.BN(await bts_coreV2.fixedFee()).toNumber() === - new_fixed_fee - ); - }); - - it("Scenario 29: Non-Owner tries to remove an Owner", async () => { - let oldList = await bts_coreV2.getOwners(); - await truffleAssert.reverts( - bts_coreV2.removeOwner.call(accounts[0], { from: accounts[2] }), - "Unauthorized" - ); - let newList = await bts_coreV2.getOwners(); - assert( - oldList.length === 2 && - oldList[0] === accounts[0] && - oldList[1] === accounts[1] && - newList.length === 2 && - newList[0] === accounts[0] && - newList[1] === accounts[1] - ); - }); - - it("Scenario 30: Current Owner removes another Owner", async () => { - let oldList = await bts_coreV2.getOwners(); - await bts_coreV2.removeOwner(accounts[0], { from: accounts[1] }); - let newList = await bts_coreV2.getOwners(); - assert( - oldList.length === 2 && - oldList[0] === accounts[0] && - oldList[1] === accounts[1] && - newList.length === 1 && - newList[0] === accounts[1] - ); - }); - - it("Scenario 31: The last Owner removes him/herself", async () => { - let oldList = await bts_coreV2.getOwners(); - await truffleAssert.reverts( - bts_coreV2.removeOwner.call(accounts[1], { from: accounts[1] }), - "Unable to remove last Owner" - ); - let newList = await bts_coreV2.getOwners(); - assert( - oldList.length === 1 && - oldList[0] === accounts[1] && - newList.length === 1 && - newList[0] === accounts[1] - ); - }); - - it("Scenario 32: Removed Owner tries to register a new coin", async () => { - let _name3 = "KYBER"; - await truffleAssert.reverts( - bts_coreV2.register.call(_name3, "", 18), - "Unauthorized" - ); - output = await bts_coreV2.coinNames(); - assert( - output[0] === _native && - output[1] === "ICON" && - output[2] === "wBTC" && - output[3] === "Ethereum" && - output[4] === "TRON" && - output[5] === "BINANCE" - ); - }); - - it("Scenario 33: Removed Owner tries to update BTSPeriphery contract", async () => { - await truffleAssert.reverts( - bts_coreV2.updateBTSPeriphery.call(accounts[3], { - from: accounts[0], - }), - "Unauthorized" - ); - }); - - it.skip("Scenario 34: Removed Owner tries to update the new URI", async () => { - // new URI no longer available - }); - - it("Scenario 35: Removed Owner tries to update new fee ratio", async () => { - let new_fee = 30; - await truffleAssert.reverts( - bts_coreV2.setFeeRatio.call(new_fee, { from: accounts[0] }), - "Unauthorized" - ); - }); - }); - - describe("As a user, I want to send PRA to ICON blockchain - After Upgrading Contract", () => { - let bts_peripheryV1, - bts_peripheryV2, - bts_coreV1, - bts_coreV2, - bmc, - nonrefundable, - refundable; - let service = "Coin/WrappedCoin"; - let _bmcICON = "btp://1234.iconee/0x1234567812345678"; - let _net = "1234.iconee"; - let _to = "btp://1234.iconee/0x12345678"; - let RC_OK = 0; - let RC_ERR = 1; - let _fixed_fee = 500000; - let deposit = 1000000000000; - let _native = "PARA"; - let _fee = 10; - let REPONSE_HANDLE_SERVICE = 2; - let _uri = "https://github.com/icon-project/icon-bridge"; - - before(async () => { - bmc = await BMC.new("1234.pra"); - bts_coreV1 = await deployProxy(BTSCoreTestV1, [ - _native, - _fee, - _fixed_fee, - ]); - bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ - bmc.address, - bts_coreV1.address, - service, - ]); - encode_msg = await EncodeMsg.new(); - await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); - await bmc.addService(service, bts_peripheryV1.address); - bts_peripheryV2 = await upgradeProxy( - bts_peripheryV1.address, - BTSPeripheryV2 - ); - bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); - nonrefundable = await NonRefundable.new(); - refundable = await Refundable.new(); - await bmc.addVerifier(_net, accounts[1]); - await bmc.addLink(_bmcICON); - }); - - it("Scenario 1: Transferring native coins to an invalid BTP Address format", async () => { - let invalid_destination = "1234.iconee/0x12345678"; - let amount = 600000; - await truffleAssert.reverts( - bts_coreV2.transferNativeCoin.call(invalid_destination, { - from: accounts[0], - value: amount, - }), - "revert" - ); - bts_coin_balance = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _native - ); - account_balance = await bts_coreV2.getBalanceOf( - accounts[0], - _native - ); - assert( - web3.utils.BN(bts_coin_balance._usableBalance).toNumber() === - 0 && - web3.utils.BN(account_balance._lockedBalance).toNumber() === - 0 - ); - }); - - it("Scenario 2: Transferring zero coin", async () => { - await truffleAssert.reverts( - bts_coreV2.transferNativeCoin.call(_to, { - from: accounts[0], - value: 0, - }), - "revert" - ); - }); - - it("Scenario 3: msg.value less than fixed_fee", async () => { - // fixed_fee = 500000; - let amount = 100000; - await truffleAssert.reverts( - bts_coreV2.transferNativeCoin.call(_to, { - from: accounts[0], - value: amount, - }), - "revert" - ); - }); - - it("Scenario 4: Transferring to an invalid network/not supported network", async () => { - let invalid_destination = "btp://1234.eos/0x12345678"; - let amount = 600000; - await truffleAssert.reverts( - bts_coreV2.transferNativeCoin.call(invalid_destination, { - from: accounts[1], - value: amount, - }), - "BMCRevertNotExistsBMV" - ); - }); - - it("Scenario 5: Account client transfers a valid native coin to a side chain", async () => { - let amount = 600000; - let account_balanceBefore = await bts_coreV2.getBalanceOf( - accounts[0], - _native - ); - let tx = await bts_coreV2.transferNativeCoin(_to, { - from: accounts[0], - value: amount, - }); - let account_balanceAfter = await bts_coreV2.getBalanceOf( - accounts[0], - _native - ); - let bts_coin_balance = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _native - ); - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferStart", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, accounts[0]); - assert.equal(event._to, _to); - assert.equal(event._sn, 1); - assert.equal(event._assetDetails.length, 1); - assert.equal(event._assetDetails[0].coinName, "PARA"); - assert.equal(event._assetDetails[0].value, amount - chargedFee); - assert.equal(event._assetDetails[0].fee, chargedFee); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 1); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - accounts[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _native - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - amount - chargedFee - ); - - assert( - web3.utils.BN(bts_coin_balance._usableBalance).toNumber() === - amount && - web3.utils - .BN(account_balanceBefore._lockedBalance) - .toNumber() === 0 && - web3.utils - .BN(account_balanceAfter._lockedBalance) - .toNumber() === amount - ); - }); - - it("Scenario 6: BTSPeriphery receives a successful response of a recent request", async () => { - let amount = 600000; - let account_balanceBefore = await bts_coreV2.getBalanceOf( - accounts[0], - _native - ); - let _msg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_OK, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 1, _msg); - let account_balanceAfter = await bts_coreV2.getBalanceOf( - accounts[0], - _native - ); - let fees = await bts_coreV2.getAccumulatedFees(); - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferEnd", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, accounts[0]); - assert.equal(event._sn, 1); - assert.equal(event._code, 0); - assert.equal(event._response, ""); - - assert( - fees[0].coinName === _native && - Number(fees[0].value) === - Math.floor(amount / 1000) + _fixed_fee && - web3.utils - .BN(account_balanceBefore._lockedBalance) - .toNumber() === amount && - web3.utils - .BN(account_balanceAfter._lockedBalance) - .toNumber() === 0 - ); - }); - - it("Scenario 5: Account client transfers a valid native coin to a side chain", async () => { - let amount = 600000; - let account_balanceBefore = await bts_coreV2.getBalanceOf( - accounts[0], - _native - ); - let tx = await bts_coreV2.transferNativeCoin(_to, { - from: accounts[0], - value: amount, - }); - let account_balanceAfter = await bts_coreV2.getBalanceOf( - accounts[0], - _native - ); - let bts_coin_balance = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _native - ); - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferStart", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, accounts[0]); - assert.equal(event._to, _to); - assert.equal(event._sn, 2); - assert.equal(event._assetDetails.length, 1); - assert.equal(event._assetDetails[0].coinName, "PARA"); - assert.equal(event._assetDetails[0].value, amount - chargedFee); - assert.equal(event._assetDetails[0].fee, chargedFee); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 2); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - accounts[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _native - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - amount - chargedFee - ); - - assert( - web3.utils.BN(bts_coin_balance._usableBalance).toNumber() === - 2 * amount && - web3.utils - .BN(account_balanceBefore._lockedBalance) - .toNumber() === 0 && - web3.utils - .BN(account_balanceAfter._lockedBalance) - .toNumber() === amount - ); - }); - - it("Scenario 7: BTSPeriphery receives an error response of a recent request", async () => { - let amount = 600000; - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - let account_balanceBefore = await bts_coreV2.getBalanceOf( - accounts[0], - _native - ); - let bts_coin_balance_before = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _native - ); - let _msg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 2, _msg); - let account_balanceAfter = await bts_coreV2.getBalanceOf( - accounts[0], - _native - ); - let bts_coin_balance_after = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _native - ); - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferEnd", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, accounts[0]); - assert.equal(event._sn, 2); - assert.equal(event._code, 1); - assert.equal(event._response, ""); - - // Unable to check balance of accounts[0] since this account has also paid gas fee - // It would be easier to check if this is a contract - // Requestor will be receive an amount of refund as - // refund = amount - chargeAmt - assert( - web3.utils - .BN(account_balanceBefore._lockedBalance) - .toNumber() === amount && - web3.utils - .BN(account_balanceAfter._lockedBalance) - .toNumber() === 0 && - web3.utils - .BN(account_balanceAfter._refundableBalance) - .toNumber() === 0 && - web3.utils - .BN(bts_coin_balance_before._usableBalance) - .toNumber() === - 2 * amount && - web3.utils - .BN(bts_coin_balance_after._usableBalance) - .toNumber() === - amount + chargedFee - ); - }); - - it("Scenario 8: Non-refundable contract transfers a valid native coin to a side chain", async () => { - let amount = 600000; - await nonrefundable.deposit({ from: accounts[2], value: deposit }); - let contract_balanceBefore = await bts_coreV2.getBalanceOf( - nonrefundable.address, - _native - ); - let bts_coin_balance_before = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _native - ); - let tx = await nonrefundable.transfer( - bts_coreV2.address, - _to, - amount - ); - let contract_balanceAfter = await bts_coreV2.getBalanceOf( - nonrefundable.address, - _native - ); - let bts_coin_balance_after = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _native - ); - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferStart", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, nonrefundable.address); - assert.equal(event._to, _to); - assert.equal(event._sn, 3); - assert.equal(event._assetDetails.length, 1); - assert.equal(event._assetDetails[0].coinName, "PARA"); - assert.equal(event._assetDetails[0].value, amount - chargedFee); - assert.equal(event._assetDetails[0].fee, chargedFee); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 3); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - nonrefundable.address - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _native - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - amount - chargedFee - ); - - assert( - web3.utils - .BN(contract_balanceBefore._usableBalance) - .toNumber() === - web3.utils - .BN(contract_balanceAfter._usableBalance) - .toNumber() + - amount && - web3.utils - .BN(contract_balanceBefore._lockedBalance) - .toNumber() === 0 && - web3.utils - .BN(contract_balanceAfter._lockedBalance) - .toNumber() === amount && - web3.utils - .BN(bts_coin_balance_before._usableBalance) - .toNumber() === - amount + chargedFee && - web3.utils - .BN(bts_coin_balance_after._usableBalance) - .toNumber() === - 2 * amount + chargedFee - ); - }); - - it(`Scenario 9: BTSPeriphery receives an error response of a recent request and fails to refund coins back to Non-refundable contract`, async () => { - let amount = 600000; - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - let contract_balanceBefore = await bts_coreV2.getBalanceOf( - nonrefundable.address, - _native - ); - let bts_coin_balance_before = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _native - ); - let _msg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 3, _msg); - let contract_balanceAfter = await bts_coreV2.getBalanceOf( - nonrefundable.address, - _native - ); - let bts_coin_balance_after = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _native - ); - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferEnd", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, nonrefundable.address); - assert.equal(event._sn, 3); - assert.equal(event._code, 1); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), - amount - ); - assert.equal( - web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(contract_balanceBefore._usableBalance).toNumber(), - web3.utils.BN(contract_balanceAfter._usableBalance).toNumber() - ); - assert.equal( - web3.utils - .BN(contract_balanceAfter._refundableBalance) - .toNumber(), - amount - chargedFee - ); - assert.equal( - web3.utils - .BN(bts_coin_balance_before._usableBalance) - .toNumber(), - web3.utils.BN(bts_coin_balance_after._usableBalance).toNumber() - ); - }); - - it("Scenario 10: Refundable contract transfers a valid native coin to a side chain", async () => { - let amount = 600000; - await refundable.deposit({ from: accounts[2], value: deposit }); - let contract_balanceBefore = await bts_coreV2.getBalanceOf( - refundable.address, - _native - ); - let bts_coin_balance_before = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _native - ); - let tx = await refundable.transfer(bts_coreV2.address, _to, amount); - let contract_balanceAfter = await bts_coreV2.getBalanceOf( - refundable.address, - _native - ); - let bts_coin_balance_after = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _native - ); - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferStart", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, refundable.address); - assert.equal(event._to, _to); - assert.equal(event._sn, 4); - assert.equal(event._assetDetails.length, 1); - assert.equal(event._assetDetails[0].coinName, "PARA"); - assert.equal(event._assetDetails[0].value, amount - chargedFee); - assert.equal(event._assetDetails[0].fee, chargedFee); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 4); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - refundable.address - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _native - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - amount - chargedFee - ); - - assert.equal( - web3.utils.BN(contract_balanceBefore._usableBalance).toNumber(), - web3.utils.BN(contract_balanceAfter._usableBalance).toNumber() + - amount - ); - assert.equal( - web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), - amount - ); - assert.equal( - web3.utils.BN(bts_coin_balance_after._usableBalance).toNumber(), - web3.utils - .BN(bts_coin_balance_before._usableBalance) - .toNumber() + amount - ); - }); - - it("Scenario 11: BTSPeriphery receives an error response of a recent request", async () => { - let amount = 600000; - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - let contract_balanceBefore = await bts_coreV2.getBalanceOf( - refundable.address, - _native - ); - let bts_coin_balance_before = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _native - ); - let _msg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 4, _msg); - let contract_balanceAfter = await bts_coreV2.getBalanceOf( - refundable.address, - _native - ); - let bts_coin_balance_after = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _native - ); - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferEnd", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, refundable.address); - assert.equal(event._sn, 4); - assert.equal(event._code, 1); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), - amount - ); - assert.equal( - web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(contract_balanceAfter._usableBalance).toNumber(), - web3.utils - .BN(contract_balanceBefore._usableBalance) - .toNumber() + - amount - - chargedFee - ); - assert.equal( - web3.utils - .BN(contract_balanceAfter._refundableBalance) - .toNumber(), - 0 - ); - assert.equal( - web3.utils - .BN(bts_coin_balance_before._usableBalance) - .toNumber(), - web3.utils - .BN(bts_coin_balance_after._usableBalance) - .toNumber() + - amount - - chargedFee - ); - }); - }); - - describe("As a user, I want to send ERC1155_ICX to ICON blockchain - After Upgrading Contract", () => { - let bts_peripheryV1, - bts_peripheryV2, - bts_coreV1, - bts_coreV2, - bmc, - holder, - coinId; - let service = "Coin/WrappedCoin"; - let _uri = "https://github.com/icon-project/icon-bridge"; - let _native = "PARA"; - let _fee = 10; - let _fixed_fee = 500000; - let _name = "ICON"; - let _bmcICON = "btp://1234.iconee/0x1234567812345678"; - let _net = "1234.iconee"; - let _from = "0x12345678"; - let _value = 999999999999999; - let REPONSE_HANDLE_SERVICE = 2; - let RC_OK = 0; - let RC_ERR = 1; - - before(async () => { - bmc = await BMC.new("1234.pra"); - bts_coreV1 = await deployProxy(BTSCoreTestV1, [ - _native, - _fee, - _fixed_fee, - ]); - bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ - bmc.address, - bts_coreV1.address, - service, - ]); - encode_msg = await EncodeMsg.new(); - await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); - await bmc.addService(service, bts_peripheryV1.address); - bts_peripheryV2 = await upgradeProxy( - bts_peripheryV1.address, - BTSPeripheryV2 - ); - bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); - holder = await Holder.new(); - await bmc.addVerifier(_net, accounts[1]); - await bmc.addLink(_bmcICON); - await holder.addBSHContract( - bts_peripheryV2.address, - bts_coreV2.address - ); - await bts_coreV2.register(_name, "", 18); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - holder.address, - _name, - _value - ); - await bmc.receiveRequest(_bmcICON, "", service, 0, _msg); - coinId = await bts_coreV2.coinId(_name); - }); - - it("Scenario 1: User has not yet set approval for token being transferred out by Operator", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _value = 600000; - let balanceBefore = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - await truffleAssert.reverts( - holder.callTransfer.call(_name, _value, _to), - "ERC20: transfer amount exceeds allowance" - ); - let balanceAfter = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - 0 - ); - }); - - it(`Scenario 2: User has set approval, but user's balance has insufficient amount`, async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _value = 9999999999999999n; - let balanceBefore = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - await holder.setApprove(coinId, bts_coreV2.address, _value); - await truffleAssert.reverts( - holder.callTransfer.call(_name, _value, _to), - "ERC20: transfer amount exceeds balance" - ); - let balanceAfter = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - 0 - ); - }); - - it("Scenario 3: User requests to transfer an invalid Token", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _value = 9999999999999999n; - let _token = "EOS"; - await holder.setApprove(coinId, bts_coreV2.address, _value); - await truffleAssert.reverts( - holder.callTransfer.call(_token, _value, _to), - "UnregisterCoin" - ); - }); - - it("Scenario 4: User transfers Tokens to an invalid BTP Address format", async () => { - let _to = "1234.iconee/0x12345678"; - let amount = 600000; - let contract_balanceBefore = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - await holder.setApprove(coinId, bts_coreV2.address, amount); - await truffleAssert.reverts( - holder.callTransfer.call(_name, amount, _to), - "VM Exception while processing transaction: revert" - ); - let contract_balanceAfter = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - let bts_core_balance = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _name - ); - - assert.equal( - web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(contract_balanceAfter._usableBalance).toNumber(), - web3.utils.BN(contract_balanceBefore._usableBalance).toNumber() - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalance).toNumber(), - 0 - ); - }); - - it("Scenario 5: User requests to transfer zero Token", async () => { - let _to = "1234.iconee/0x12345678"; - let amount = 600000; - let balanceBefore = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - await holder.setApprove(coinId, bts_coreV2.address, amount); - await truffleAssert.reverts( - holder.callTransfer.call(_name, 0, _to), - "revert" - ); - let balanceAfter = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() - ); - }); - - it("Scenario 6: Transferring amount is less than fixed fee", async () => { - let _to = "1234.iconee/0x12345678"; - let _name = "ICON"; - let amount = 100000; - let balanceBefore = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - await holder.setApprove(coinId, bts_coreV2.address, amount); - await truffleAssert.reverts( - holder.callTransfer.call(_name, amount, _to), - "revert" - ); - let balanceAfter = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() - ); - }); - - it("Scenario 7: User requests to transfer to an invalid network/Not Supported Network", async () => { - let _to = "btp://1234.eos/0x12345678"; - let _name = "ICON"; - let amount = 600000; - let balanceBefore = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - await holder.setApprove(coinId, bts_coreV2.address, amount); - await truffleAssert.reverts( - holder.callTransfer.call(_name, amount, _to), - "BMCRevertNotExistsBMV" - ); - let balanceAfter = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - let bts_core_balance = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _name - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalance).toNumber(), - 0 - ); - }); - - it("Scenario 8: User sends a valid transferring request", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let amount = 600000; - let balanceBefore = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - await holder.setApprove(coinId, bts_coreV2.address, amount); - let tx = await holder.callTransfer(_name, amount, _to); - let balanceAfter = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - let bts_core_balance = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _name - ); - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferStart", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, holder.address); - assert.equal(event._to, _to); - assert.equal(event._sn, 1); - assert.equal(event._assetDetails.length, 1); - assert.equal(event._assetDetails[0].coinName, _name); - assert.equal(event._assetDetails[0].value, amount - chargedFee); - assert.equal(event._assetDetails[0].fee, chargedFee); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 1); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - holder.address - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _name - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - amount - chargedFee - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - amount - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() - amount - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalance).toNumber(), - amount - ); - }); - - it("Scenario 9: BTSPeriphery receives a successful response of a recent request", async () => { - let amount = 600000; - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - let contract_balanceBefore = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - let _msg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_OK, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 1, _msg); - let contract_balanceAfter = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - let fees = await bts_coreV2.getAccumulatedFees(); - let bts_core_balance = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _name - ); - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferEnd", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, holder.address); - assert.equal(event._sn, 1); - assert.equal(event._code, 0); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), - amount - ); - assert.equal( - web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(contract_balanceBefore._usableBalance).toNumber(), - web3.utils.BN(contract_balanceAfter._usableBalance).toNumber() - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalance).toNumber(), - chargedFee - ); - assert.equal(fees[1].coinName, _name); - assert.equal(Number(fees[1].value), chargedFee); - }); - - it("Scenario 8: User sends a valid transferring request", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let amount = 100000000000000; - let balanceBefore = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - let bts_core_balance_before = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _name - ); - await holder.setApprove(coinId, bts_coreV2.address, amount); - let tx = await holder.callTransfer(_name, amount, _to); - let balanceAfter = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - let bts_core_balance_after = await bts_coreV2.getBalanceOf( - bts_coreV2.address, - _name - ); - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferStart", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, holder.address); - assert.equal(event._to, _to); - assert.equal(event._sn, 2); - assert.equal(event._assetDetails.length, 1); - assert.equal(event._assetDetails[0].coinName, _name); - assert.equal(event._assetDetails[0].value, amount - chargedFee); - assert.equal(event._assetDetails[0].fee, chargedFee); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 2); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - holder.address - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _name - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - amount - chargedFee - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - amount - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() - amount - ); - assert.equal( - web3.utils.BN(bts_core_balance_after._usableBalance).toNumber(), - web3.utils - .BN(bts_core_balance_before._usableBalance) - .toNumber() + amount - ); - }); - - it("Scenario 10: BTSPeriphery receives an error response of a recent request", async () => { - let amount = 100000000000000; - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - let balanceBefore = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - let _msg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 2, _msg); - let balanceAfter = await bts_coreV2.getBalanceOf( - holder.address, - _name - ); - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferEnd", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, holder.address); - assert.equal(event._sn, 2); - assert.equal(event._code, 1); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - amount - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() + - amount - - chargedFee - ); - assert.equal( - web3.utils.BN(balanceAfter._refundableBalance).toNumber(), - 0 - ); - }); - }); - - describe("As a user, I want to receive PRA from ICON blockchain - After Upgrading Contract", () => { - let bmc, - bts_peripheryV1, - bts_peripheryV2, - bts_coreV1, - bts_coreV2, - notpayable, - refundable; - let service = "Coin/WrappedCoin"; - let _bmcICON = "btp://1234.iconee/0x1234567812345678"; - let _net = "1234.iconee"; - let _to = "btp://1234.iconee/0x12345678"; - let _native = "PARA"; - let _fee = 10; - let _fixed_fee = 500000; - let RC_ERR = 1; - let RC_OK = 0; - let _uri = "https://github.com/icon-project/icon-bridge"; - - before(async () => { - bmc = await BMC.new("1234.pra"); - bts_coreV1 = await deployProxy(BTSCoreTestV1, [ - _native, - _fee, - _fixed_fee, - ]); - bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ - bmc.address, - bts_coreV1.address, - service, - ]); - encode_msg = await EncodeMsg.new(); - await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); - await bmc.addService(service, bts_peripheryV1.address); - bts_peripheryV2 = await upgradeProxy( - bts_peripheryV1.address, - BTSPeripheryV2 - ); - bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); - notpayable = await NotPayable.new(); - refundable = await Refundable.new(); - await bmc.addVerifier(_net, accounts[1]); - await bmc.addLink(_bmcICON); - await bts_coreV2.transferNativeCoin(_to, { - from: accounts[0], - value: 100000000, - }); - btpAddr = await bmc.bmcAddress(); - }); - - it("Scenario 1: Receiving address is invalid", async () => { - let _from = "0x12345678"; - let _value = 1000; - let _address = "0x1234567890123456789"; - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "InvalidAddress" - ); - let _msg = await encode_msg.encodeTransferMsgWithStringAddress( - _from, - _address, - _native, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - assert( - output.logs[0].args._next === _bmcICON && - output.logs[0].args._msg === _eventMsg - ); - }); - - it("Scenario 2: BTSCore has insufficient funds to transfer", async () => { - let _from = "0x12345678"; - let _value = 1000000000; - let balanceBefore = await bmc.getBalance(accounts[1]); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "TransferFailed" - ); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - accounts[1], - _native, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = await bmc.getBalance(accounts[1]); - - assert.equal( - web3.utils.BN(balanceAfter).toString(), - web3.utils.BN(balanceBefore).toString() - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it(`Scenario 3: BTSCore tries to transfer PARA coins to a non-payable contract, but it fails`, async () => { - let _from = "0x12345678"; - let _value = 1000; - let balanceBefore = await bmc.getBalance(notpayable.address); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "TransferFailed" - ); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - notpayable.address, - _native, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = await bmc.getBalance(notpayable.address); - - assert.equal( - web3.utils.BN(balanceAfter).toNumber(), - web3.utils.BN(balanceBefore).toNumber() - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 4: BTSPeriphery receives a request of transferring coins", async () => { - let _from = "0x12345678"; - let _value = 12345; - let balanceBefore = await bmc.getBalance(accounts[1]); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_OK, - "" - ); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - accounts[1], - _native, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = await bmc.getBalance(accounts[1]); - - assert.equal( - web3.utils.BN(balanceAfter).toString(), - web3.utils - .BN(balanceBefore) - .add(new web3.utils.BN(_value)) - .toString() - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it(`Scenario 5: BTSPeriphery receives a request of transferring coins`, async () => { - let _from = "0x12345678"; - let _value = 23456; - let balanceBefore = await bmc.getBalance(refundable.address); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_OK, - "" - ); - let _msg = await encode_msg.encodeTransferMsgWithStringAddress( - _from, - refundable.address, - _native, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = await bmc.getBalance(refundable.address); - - assert.equal( - web3.utils.BN(balanceAfter).toNumber(), - web3.utils.BN(balanceBefore).toNumber() + _value - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - }); - - describe.skip("As a user, I want to receive ERC1155_ICX from ICON blockchain - After Upgrading Contract", () => { - let bmc, - bts_peripheryV1, - bts_peripheryV2, - bts_coreV1, - bts_coreV2, - holder, - notpayable; - let service = "Coin/WrappedCoin"; - let _uri = "https://github.com/icon-project/icon-bridge"; - let _native = "PARA"; - let _fee = 10; - let _fixed_fee = 500000; - let _name = "ICON"; - let _bmcICON = "btp://1234.iconee/0x1234567812345678"; - let _net = "1234.iconee"; - let _from = "0x12345678"; - let RC_ERR = 1; - let RC_OK = 0; - - before(async () => { - bmc = await BMC.new("1234.pra"); - bts_coreV1 = await deployProxy(BTSCoreTestV1, [ - _native, - _fee, - _fixed_fee, - ]); - bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ - bmc.address, - bts_coreV1.address, - service, - ]); - encode_msg = await EncodeMsg.new(); - await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); - await bmc.addService(service, bts_peripheryV1.address); - bts_peripheryV2 = await upgradeProxy( - bts_peripheryV1.address, - BTSPeripheryV2 - ); - bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); - holder = await Holder.new(); - notpayable = await NotPayable.new(); - await bmc.addVerifier(_net, accounts[1]); - await bmc.addLink(_bmcICON); - await holder.addBSHContract( - bts_peripheryV2.address, - bts_coreV2.address - ); - await bts_coreV2.register(_name, "", 18); - coinId = await bts_coreV2.coinId(_name); - btpAddr = await bmc.bmcAddress(); - }); - - it("Scenario 1: Receiving address is invalid", async () => { - let _value = 1000; - let _address = "0x1234567890123456789"; - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "InvalidAddress" - ); - let _msg = await encode_msg.encodeTransferMsgWithStringAddress( - _from, - _address, - _name, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it(`Scenario 2: Receiving contract does not implement ERC1155Holder / Receiver`, async () => { - let _value = 1000; - let balanceBefore = ( - await bts_coreV2.getBalanceOf(notpayable.address, _name) - )[0]; - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "TransferFailed" - ); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - notpayable.address, - _name, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = ( - await bts_coreV2.getBalanceOf(notpayable.address, _name) - )[0]; - - assert.equal( - web3.utils.BN(balanceAfter).toNumber(), - web3.utils.BN(balanceBefore).toNumber() - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 3: BTSPeriphery receives a request of invalid token", async () => { - let _value = 3000; - let _tokenName = "Ethereum"; - let invalid_coin_id = await bts_coreV2.coinId(_tokenName); - let balanceBefore = ( - await bts_coreV2.getBalanceOf(notpayable.address, _tokenName) - )[0]; - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "UnregisteredCoin" - ); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - holder.address, - _tokenName, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = ( - await bts_coreV2.getBalanceOf(notpayable.address, _tokenName) - )[0]; - - assert.equal( - web3.utils.BN(balanceAfter).toNumber(), - web3.utils.BN(balanceBefore).toNumber() - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 4: Receiver is a ERC1155Holder contract", async () => { - let _value = 2500; - let balanceBefore = ( - await bts_coreV2.getBalanceOf(notpayable.address, _name) - )[0]; - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_OK, - "" - ); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - holder.address, - _name, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = ( - await bts_coreV2.getBalanceOf(notpayable.address, _name) - )[0]; - - assert.equal( - web3.utils.BN(balanceAfter).toNumber(), - web3.utils.BN(balanceBefore).toNumber() + _value - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 5: Receiver is an account client", async () => { - let _value = 5500; - let balanceBefore = ( - await bts_coreV2.getBalanceOf(notpayable.address, _name) - )[0]; - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_OK, - "" - ); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - accounts[1], - _name, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = ( - await bts_coreV2.getBalanceOf(notpayable.address, _name) - )[0]; - - assert.equal( - web3.utils.BN(balanceAfter).toNumber(), - web3.utils.BN(balanceBefore).toNumber() + _value - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - }); - - describe("BSHs Handle Fee Aggregation - After Upgrading Contract", () => { - let bts_peripheryV1, - bts_peripheryV2, - bts_coreV1, - bts_coreV2, - bmc, - holder; - let service = "Coin/WrappedCoin"; - let _uri = "https://github.com/icon-project/icon-bridge"; - let _native = "PARA"; - let _fee = 10; - let _fixed_fee = 500000; - let _name1 = "ICON"; - let _name2 = "BINANCE"; - let _name3 = "ETHEREUM"; - let _name4 = "TRON"; - let _net1 = "1234.iconee"; - let _net2 = "1234.binance"; - let _from1 = "0x12345678"; - let _from2 = "0x12345678"; - let _value1 = 999999999999999; - let _value2 = 999999999999999; - let _to1 = "btp://1234.iconee/0x12345678"; - let _to2 = "btp://1234.binance/0x12345678"; - let _txAmt = 1000000; - let _txAmt1 = 100000000; - let _txAmt2 = 5000000; - let RC_OK = 0; - let RC_ERR = 1; - let REPONSE_HANDLE_SERVICE = 2; - let _bmcICON = "btp://1234.iconee/0x1234567812345678"; - let _sn0 = 1; - let _sn1 = 2; - let _sn2 = 3; - - before(async () => { - bmc = await BMC.new("1234.pra"); - bts_coreV1 = await deployProxy(BTSCoreTestV1, [ - _native, - _fee, - _fixed_fee, - ]); - bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ - bmc.address, - bts_coreV1.address, - service, - ]); - encode_msg = await EncodeMsg.new(); - await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); - await bmc.addService(service, bts_peripheryV1.address); - bts_peripheryV2 = await upgradeProxy( - bts_peripheryV1.address, - BTSPeripheryV2 - ); - bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); - holder = await Holder.new(); - btpAddr = await bmc.bmcAddress(); - await bmc.addVerifier(_net1, accounts[1]); - await bmc.addVerifier(_net2, accounts[2]); - await bmc.addLink(_bmcICON); - await holder.addBSHContract( - bts_peripheryV2.address, - bts_coreV2.address - ); - await bts_coreV2.register(_name1, "", 18); - await bts_coreV2.register(_name2, "", 18); - await bts_coreV2.register(_name3, "", 18); - await bts_coreV2.register(_name4, "", 18); - let _msg1 = await encode_msg.encodeTransferMsgWithAddress( - _from1, - holder.address, - _name1, - _value1 - ); - await bmc.receiveRequest(_bmcICON, "", service, _sn0, _msg1); - let _msg2 = await encode_msg.encodeTransferMsgWithAddress( - _from2, - holder.address, - _name2, - _value2 - ); - await bmc.receiveRequest(_bmcICON, "", service, _sn1, _msg2); - await bts_coreV2.transferNativeCoin(_to1, { - from: accounts[0], - value: _txAmt, - }); - let _responseMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_OK, - "" - ); - await bmc.receiveResponse(_net1, service, _sn0, _responseMsg); - coinId1 = await bts_coreV2.coinId(_name1); - coinId2 = await bts_coreV2.coinId(_name2); - coinId3 = await bts_coreV2.coinId(_name3); - coinId4 = await bts_coreV2.coinId(_name4); - await holder.setApprove(coinId1, bts_coreV2.address, _txAmt1); - await holder.setApprove(coinId2, bts_coreV2.address, _txAmt2); - await holder.setApprove(coinId3, bts_coreV2.address, _txAmt2); - await holder.setApprove(coinId4, bts_coreV2.address, _txAmt2); - await holder.callTransfer(_name1, _txAmt1, _to1); - await bmc.receiveResponse(_net1, service, _sn1, _responseMsg); - await holder.callTransfer(_name2, _txAmt2, _to2); - await bmc.receiveResponse(_net1, service, _sn2, _responseMsg); - }); - - it(`Scenario 1: Query 'Aggregation Fee'`, async () => { - let aggregationFee = await bts_coreV2.getAccumulatedFees(); - - assert.equal(aggregationFee.length, 5); - assert.equal(aggregationFee[0].coinName, "PARA"); - assert.equal(aggregationFee[1].coinName, "ICON"); - assert.equal(aggregationFee[2].coinName, "BINANCE"); - assert.equal(aggregationFee[3].coinName, "ETHEREUM"); - assert.equal(aggregationFee[4].coinName, "TRON"); - - assert.equal( - Number(aggregationFee[0].value), - Math.floor(_txAmt / 1000) + _fixed_fee - ); - assert.equal( - Number(aggregationFee[1].value), - Math.floor(_txAmt1 / 1000) + _fixed_fee - ); - assert.equal( - Number(aggregationFee[2].value), - Math.floor(_txAmt2 / 1000) + _fixed_fee - ); - assert.equal(Number(aggregationFee[3].value), 0); - assert.equal(Number(aggregationFee[4].value), 0); - }); - - it("Scenario 2: Receiving a FeeGathering request not from BMCService", async () => { - let _sn3 = 3; - let FA1Before = await bts_peripheryV2.getAggregationFeeOf(_native); // state Aggregation Fee of each type of Coins - let FA2Before = await bts_peripheryV2.getAggregationFeeOf(_name1); - let FA3Before = await bts_peripheryV2.getAggregationFeeOf(_name2); - await truffleAssert.reverts( - bts_peripheryV2.handleFeeGathering.call(_to1, service, { - from: accounts[1], - }), - "Unauthorized" - ); - let FA1After = await bts_peripheryV2.getAggregationFeeOf(_native); - let FA2After = await bts_peripheryV2.getAggregationFeeOf(_name1); - let FA3After = await bts_peripheryV2.getAggregationFeeOf(_name2); - let fees = await bts_peripheryV2.getPendingRequest(_sn3); // get pending Aggregation Fee list - - assert.equal( - web3.utils.BN(FA1Before).toNumber(), - web3.utils.BN(FA1After).toNumber() - ); - assert.equal( - web3.utils.BN(FA2Before).toNumber(), - web3.utils.BN(FA2After).toNumber() - ); - assert.equal( - web3.utils.BN(FA3Before).toNumber(), - web3.utils.BN(FA3After).toNumber() - ); - assert.equal(fees.amounts.length, 0); - }); - - // Before: - // + state Aggregation Fee of each type of Coins are set - // + pendingAggregation Fee list is empty - // After: - // + all states of Aggregation Fee are push into pendingAggregation Fee list - // + state Aggregation Fee of each type of Coins are reset - it("Scenario 3: Handle GatherFee request from BMCService contract", async () => { - let _sn3 = 4; - let FA1Before = await bts_peripheryV2.getAggregationFeeOf(_native); // state Aggregation Fee of each type of Coins - let FA2Before = await bts_peripheryV2.getAggregationFeeOf(_name1); - let FA3Before = await bts_peripheryV2.getAggregationFeeOf(_name2); - let _bmcService = await encode_msg.encodeBMCService(_to1, [ - service, - ]); - let output = await bmc.receiveRequest( - _bmcICON, - "", - "bmc", - 100, - _bmcService - ); - let FA1After = await bts_peripheryV2.getAggregationFeeOf(_native); - let FA2After = await bts_peripheryV2.getAggregationFeeOf(_name1); - let FA3After = await bts_peripheryV2.getAggregationFeeOf(_name2); - let fees = await bts_peripheryV2.getPendingRequest(_sn3); // get pending Aggregation Fee list - let list = []; - for (let i = 0; i < fees.amounts.length; i++) { - list[i] = [fees.coinNames[i], fees.amounts[i]]; - } - let _eventMsg = await encode_msg.encodeTransferFeesBMCMessage( - btpAddr, - _bmcICON, - _to1, - service, - _sn3, - bts_coreV2.address, - list - ); - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferStart", - { fromBlock: output.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, bts_coreV2.address); - assert.equal(event._to, _to1); - assert.equal(event._sn, _sn3); - assert.equal(event._assetDetails.length, 3); - assert.equal(event._assetDetails[0].coinName, _native); - assert.equal(event._assetDetails[0].value, fees.amounts[0]); - assert.equal(event._assetDetails[0].fee, 0); - assert.equal(event._assetDetails[1].coinName, _name1); - assert.equal(event._assetDetails[1].value, fees.amounts[1]); - assert.equal(event._assetDetails[1].fee, 0); - assert.equal(event._assetDetails[2].coinName, _name2); - assert.equal(event._assetDetails[2].value, fees.amounts[2]); - assert.equal(event._assetDetails[2].fee, 0); - - assert.equal( - web3.utils.BN(FA1Before).toNumber(), - Math.floor(_txAmt / 1000) + _fixed_fee - ); - assert.equal( - web3.utils.BN(FA2Before).toNumber(), - Math.floor(_txAmt1 / 1000) + _fixed_fee - ); - assert.equal( - web3.utils.BN(FA3Before).toNumber(), - Math.floor(_txAmt2 / 1000) + _fixed_fee - ); - - assert.equal(web3.utils.BN(FA1After).toNumber(), 0); - assert.equal(web3.utils.BN(FA2After).toNumber(), 0); - assert.equal(web3.utils.BN(FA3After).toNumber(), 0); - - assert.equal(fees.coinNames[0], _native); - assert.equal(fees.coinNames[1], _name1); - assert.equal(fees.coinNames[2], _name2); - - assert.equal( - Number(fees.amounts[0]), - Math.floor(_txAmt / 1000) + _fixed_fee - ); - assert.equal( - Number(fees.amounts[1]), - Math.floor(_txAmt1 / 1000) + _fixed_fee - ); - assert.equal( - Number(fees.amounts[2]), - Math.floor(_txAmt2 / 1000) + _fixed_fee - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 4: Receiving a successful response", async () => { - let _sn3 = 4; - let feesBefore = await bts_peripheryV2.getPendingRequest(_sn3); - let _responseMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_OK, - "" - ); - let tx = await bmc.receiveResponse( - _net1, - service, - _sn3, - _responseMsg - ); - let feesAfter = await bts_peripheryV2.getPendingRequest(_sn3); - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferEnd", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, bts_coreV2.address); - assert.equal(event._sn, _sn3); - assert.equal(event._code, 0); - assert.equal(event._response, ""); - - assert.equal(feesBefore.amounts.length, 3); - assert.equal(feesBefore.coinNames[0], _native); - assert.equal(feesBefore.coinNames[1], _name1); - assert.equal(feesBefore.coinNames[2], _name2); - assert.equal( - Number(feesBefore.amounts[0]), - Math.floor(_txAmt / 1000) + _fixed_fee - ); - assert.equal( - Number(feesBefore.amounts[1]), - Math.floor(_txAmt1 / 1000) + _fixed_fee - ); - assert.equal( - Number(feesBefore.amounts[2]), - Math.floor(_txAmt2 / 1000) + _fixed_fee - ); - assert.equal(feesAfter.amounts.length, 0); - }); - - it("Scenario 5: Receiving an error response", async () => { - let _sn4 = 5; - let _sn5 = 6; - let _sn6 = 7; - let _amt1 = 2000000; - let _amt2 = 6000000; - await holder.setApprove(coinId1, bts_coreV2.address, _amt1); - await holder.setApprove(coinId2, bts_coreV2.address, _amt2); - await holder.callTransfer(_name1, _amt1, _to1); - let _responseMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_OK, - "" - ); - await bmc.receiveResponse(_net1, service, _sn4, _responseMsg); - await holder.callTransfer(_name2, _amt2, _to2); - await bmc.receiveResponse(_net2, service, _sn5, _responseMsg); - let _bmcService = await encode_msg.encodeBMCService(_to1, [ - service, - ]); - await bmc.receiveRequest(_bmcICON, "", "bmc", 100, _bmcService); - - let FA1Before = await bts_peripheryV2.getAggregationFeeOf(_name1); - let FA2Before = await bts_peripheryV2.getAggregationFeeOf(_name2); - let feesBefore = await bts_peripheryV2.getPendingRequest(_sn6); - let _errMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net1, service, _sn6, _errMsg); - let FA1After = await bts_peripheryV2.getAggregationFeeOf(_name1); - let FA2After = await bts_peripheryV2.getAggregationFeeOf(_name2); - let feesAfter = await bts_peripheryV2.getPendingRequest(_sn6); - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferEnd", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, bts_coreV2.address); - assert.equal(event._sn, _sn6); - assert.equal(event._code, 1); - assert.equal(event._response, ""); - - assert.equal(feesBefore.amounts.length, 2); - assert.equal(feesBefore.coinNames[0], _name1); - assert.equal(feesBefore.coinNames[1], _name2); - assert.equal( - Number(feesBefore.amounts[0]), - Math.floor(_amt1 / 1000) + _fixed_fee - ); - assert.equal( - Number(feesBefore.amounts[1]), - Math.floor(_amt2 / 1000) + _fixed_fee - ); - - assert.equal(web3.utils.BN(FA1Before).toNumber(), 0); - assert.equal(web3.utils.BN(FA2Before).toNumber(), 0); - assert.equal(feesAfter.amounts.length, 0); - assert.equal( - web3.utils.BN(FA1After).toNumber(), - Math.floor(_amt1 / 1000) + _fixed_fee - ); - assert.equal( - web3.utils.BN(FA2After).toNumber(), - Math.floor(_amt2 / 1000) + _fixed_fee - ); - }); - }); - - describe("As a user, I want to receive multiple Coins/Tokens from ICON blockchain - After Upgrading Contract", () => { - let bts_peripheryV1, - bts_peripheryV2, - bts_coreV1, - bts_coreV2, - bmc, - holder, - refundable; - let service = "Coin/WrappedCoin"; - let _uri = "https://github.com/icon-project/icon-bridge"; - let _native = "PARA"; - let _fee = 10; - let _fixed_fee = 500000; - let _name1 = "ICON"; - let _name2 = "BINANCE"; - let _name3 = "ETHEREUM"; - let _name4 = "TRON"; - let _net1 = "1234.iconee"; - let _bmcICON = "btp://1234.iconee/0x1234567812345678"; - let RC_OK = 0; - let RC_ERR = 1; - let _from1 = "0x12345678"; - let _to = "btp://1234.iconee/0x12345678"; - - before(async () => { - bmc = await BMC.new("1234.pra"); - bts_coreV1 = await deployProxy(BTSCoreTestV1, [ - _native, - _fee, - _fixed_fee, - ]); - bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ - bmc.address, - bts_coreV1.address, - service, - ]); - encode_msg = await EncodeMsg.new(); - await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); - await bmc.addService(service, bts_peripheryV1.address); - bts_peripheryV2 = await upgradeProxy( - bts_peripheryV1.address, - BTSPeripheryV2 - ); - bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); - holder = await Holder.new(); - refundable = await Refundable.new(); - btpAddr = await bmc.bmcAddress(); - await bmc.addVerifier(_net1, accounts[1]); - await bmc.addLink(_bmcICON); - await holder.addBSHContract( - bts_peripheryV2.address, - bts_coreV2.address - ); - await bts_coreV2.register(_name1, "", 18); - await bts_coreV2.register(_name2, "", 18); - await bts_coreV2.register(_name3, "", 18); - await bts_coreV2.register(_name4, "", 18); - await bts_coreV2.transferNativeCoin(_to, { - from: accounts[0], - value: 10000000, - }); - }); - - it("Scenario 1: Receiving address is invalid", async () => { - let _value1 = 1000; - let _value2 = 10000; - let _value3 = 40000; - let _address = "0x1234567890123456789"; - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "InvalidAddress" - ); - let _msg = await encode_msg.encodeBatchTransferMsgWithStringAddress( - _from1, - _address, - [ - [_native, _value1], - [_name1, _value2], - [_name2, _value3], - ] - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 2: BSHPerphery receives a request of invalid token", async () => { - let _value1 = 1000; - let _value2 = 10000; - let _value3 = 40000; - let _invalid_token = "EOS"; - let balance1Before = await bts_coreV2.getBalanceOf( - holder.address, - _name1 - ); - let balance2Before = await bts_coreV2.getBalanceOf( - holder.address, - _name2 - ); - let balance3Before = await bts_coreV2.getBalanceOf( - holder.address, - _invalid_token - ); - - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "UnregisteredCoin" - ); - let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( - _from1, - holder.address, - [ - [_name1, _value1], - [_name2, _value2], - [_invalid_token, _value3], - ] - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balance1After = await bts_coreV2.getBalanceOf( - holder.address, - _name1 - ); - let balance2After = await bts_coreV2.getBalanceOf( - holder.address, - _name2 - ); - let balance3After = await bts_coreV2.getBalanceOf( - holder.address, - _invalid_token - ); - - assert.equal( - web3.utils.BN(balance1Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance3Before._usableBalance).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balance1After._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2After._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance3After._usableBalance).toNumber(), - 0 - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 3: One of requests is failed in TransferBatch", async () => { - let _value1 = 1000; - let _value2 = 10000; - let _value3 = 20000000; - let balance1Before = await bts_coreV2.getBalanceOf( - accounts[1], - _name1 - ); - let balance2Before = await bts_coreV2.getBalanceOf( - accounts[1], - _name2 - ); - let balance3Before = await bts_coreV2.getBalanceOf( - accounts[1], - _native - ); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "TransferFailed" - ); - let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( - _from1, - accounts[1], - [ - [_name1, _value1], - [_name2, _value2], - [_native, _value3], - ] - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balance1After = await bts_coreV2.getBalanceOf( - accounts[1], - _name1 - ); - let balance2After = await bts_coreV2.getBalanceOf( - accounts[1], - _name2 - ); - let balance3After = await bts_coreV2.getBalanceOf( - accounts[1], - _native - ); - - assert.equal( - web3.utils.BN(balance1Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2Before._usableBalance).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balance1After._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2After._usableBalance).toNumber(), - 0 - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 4: One of requests is failed in TransferBatch", async () => { - let _value1 = 1000; - let _value2 = 10000; - let _value3 = 40000; - let balance1Before = await bts_coreV2.getBalanceOf( - refundable.address, - _native - ); - let balance2Before = await bts_coreV2.getBalanceOf( - refundable.address, - _name1 - ); - let balance3Before = await bts_coreV2.getBalanceOf( - refundable.address, - _name2 - ); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "TransferFailed" - ); - let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( - _from1, - refundable.address, - [ - [_native, _value1], - [_name1, _value2], - [_name2, _value3], - ] - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balance1After = await bts_coreV2.getBalanceOf( - refundable.address, - _native - ); - let balance2After = await bts_coreV2.getBalanceOf( - refundable.address, - _name1 - ); - let balance3After = await bts_coreV2.getBalanceOf( - refundable.address, - _name2 - ); - - assert.equal( - web3.utils.BN(balance1Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance3Before._usableBalance).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balance1After._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2After._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance3After._usableBalance).toNumber(), - 0 - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 5: One of requests is failed in TransferBatch", async () => { - let _value1 = 1000; - let _value2 = 10000; - let _value3 = 40000; - let balance1Before = await bts_coreV2.getBalanceOf( - holder.address, - _name1 - ); - let balance2Before = await bts_coreV2.getBalanceOf( - holder.address, - _name2 - ); - let balance3Before = await bts_coreV2.getBalanceOf( - holder.address, - _native - ); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "TransferFailed" - ); - let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( - _from1, - holder.address, - [ - [_name1, _value1], - [_name2, _value2], - [_native, _value3], - ] - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balance1After = await bts_coreV2.getBalanceOf( - holder.address, - _name1 - ); - let balance2After = await bts_coreV2.getBalanceOf( - holder.address, - _name2 - ); - let balance3After = await bts_coreV2.getBalanceOf( - holder.address, - _native - ); - - assert.equal( - web3.utils.BN(balance1Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance3Before._usableBalance).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balance1After._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2After._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance3After._usableBalance).toNumber(), - 0 - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 6: Receiving a successful TransferBatch request", async () => { - let _value1 = 1000; - let _value2 = 10000; - let _value3 = 40000; - let balance1Before = await bts_coreV2.getBalanceOf( - holder.address, - _name1 - ); - let balance2Before = await bts_coreV2.getBalanceOf( - holder.address, - _name2 - ); - let balance3Before = await bts_coreV2.getBalanceOf( - holder.address, - _name3 - ); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_OK, - "" - ); - let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( - _from1, - holder.address, - [ - [_name1, _value1], - [_name2, _value2], - [_name3, _value3], - ] - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balance1After = await bts_coreV2.getBalanceOf( - holder.address, - _name1 - ); - let balance2After = await bts_coreV2.getBalanceOf( - holder.address, - _name2 - ); - let balance3After = await bts_coreV2.getBalanceOf( - holder.address, - _name3 - ); - - assert.equal( - web3.utils.BN(balance1Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance3Before._usableBalance).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balance1After._usableBalance).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balance2After._usableBalance).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balance3After._usableBalance).toNumber(), - _value3 - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 7: Receiving a successful TransferBatch request", async () => { - let _value1 = 1000; - let _value2 = 10000; - let _value3 = 40000; - let balance1Before = await bts_coreV2.getBalanceOf( - accounts[1], - _native - ); - let balance2Before = await bts_coreV2.getBalanceOf( - accounts[1], - _name2 - ); - let balance3Before = await bts_coreV2.getBalanceOf( - accounts[1], - _name3 - ); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_OK, - "" - ); - let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( - _from1, - accounts[1], - [ - [_native, _value1], - [_name2, _value2], - [_name3, _value3], - ] - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balance1After = await bts_coreV2.getBalanceOf( - accounts[1], - _native - ); - let balance2After = await bts_coreV2.getBalanceOf( - accounts[1], - _name2 - ); - let balance3After = await bts_coreV2.getBalanceOf( - accounts[1], - _name3 - ); - - assert.equal( - web3.utils.BN(balance1After._usableBalance).toString(), - web3.utils - .BN(balance1Before._usableBalance) - .add(new web3.utils.BN(_value1)) - .toString() - ); - assert.equal( - web3.utils.BN(balance2After._usableBalance).toNumber(), - web3.utils.BN(balance2Before._usableBalance).toNumber() + - _value2 - ); - assert.equal( - web3.utils.BN(balance3After._usableBalance).toNumber(), - web3.utils.BN(balance3Before._usableBalance).toNumber() + - _value3 - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - }); - - describe("As a user, I want to send multiple coins/tokens to ICON blockchain - After Upgrading Contract", () => { - let bts_peripheryV1, - bts_peripheryV2, - bts_coreV1, - bts_coreV2, - bmc, - holder; - let service = "Coin/WrappedCoin"; - let _uri = "https://github.com/icon-project/icon-bridge"; - let _native = "PARA"; - let _fee = 10; - let _fixed_fee = 500000; - let _net = "1234.iconee"; - let _from = "0x12345678"; - let _value = 999999999999999; - let REPONSE_HANDLE_SERVICE = 2; - let RC_OK = 0; - let RC_ERR = 1; - let _bmcICON = "btp://1234.iconee/0x1234567812345678"; - let _coin1 = "ICON"; - let _coin2 = "TRON"; - let _coin3 = "BINANCE"; - let initAmt = 1000000000000000; - - before(async () => { - bmc = await BMC.new("1234.pra"); - bts_coreV1 = await deployProxy(BTSCoreTestV1, [ - _native, - _fee, - _fixed_fee, - ]); - bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ - bmc.address, - bts_coreV1.address, - service, - ]); - encode_msg = await EncodeMsg.new(); - await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); - await bmc.addService(service, bts_peripheryV1.address); - bts_peripheryV2 = await upgradeProxy( - bts_peripheryV1.address, - BTSPeripheryV2 - ); - bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); - holder = await Holder.new(); - await bmc.addVerifier(_net, accounts[1]); - await bmc.addLink(_bmcICON); - await holder.addBSHContract( - bts_peripheryV2.address, - bts_coreV2.address - ); - await bts_coreV2.register(_coin1, "", 18); - await bts_coreV2.register(_coin2, "", 18); - await bts_coreV2.register(_coin3, "", 18); - await bts_coreV2.transferNativeCoin( - "btp://1234.iconee/0x12345678", - { from: accounts[0], value: initAmt } - ); - await holder.deposit({ from: accounts[1], value: 100000000000000 }); - let _msg1 = await encode_msg.encodeTransferMsgWithAddress( - _from, - holder.address, - _coin1, - _value - ); - await bmc.receiveRequest(_bmcICON, "", service, 0, _msg1); - let _msg2 = await encode_msg.encodeTransferMsgWithAddress( - _from, - holder.address, - _coin2, - _value - ); - await bmc.receiveRequest(_bmcICON, "", service, 1, _msg2); - let _msg3 = await encode_msg.encodeTransferMsgWithAddress( - _from, - holder.address, - _coin3, - _value - ); - await bmc.receiveRequest(_bmcICON, "", service, 2, _msg3); - - _msg1 = await encode_msg.encodeTransferMsgWithAddress( - _from, - accounts[1], - _coin1, - _value - ); - await bmc.receiveRequest(_bmcICON, "", service, 0, _msg1); - _msg2 = await encode_msg.encodeTransferMsgWithAddress( - _from, - accounts[1], - _coin2, - _value - ); - await bmc.receiveRequest(_bmcICON, "", service, 1, _msg2); - _msg3 = await encode_msg.encodeTransferMsgWithAddress( - _from, - accounts[1], - _coin3, - _value - ); - await bmc.receiveRequest(_bmcICON, "", service, 2, _msg3); - }); - - it("Scenario 1: User has not yet set approval for token being transferred out by Operator", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _coins = [_coin1, _coin2]; - let _values = [600000, 700000]; - let _native_amt = 800000; - let _query = [_native, _coin1, _coin2]; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_coreV2.address, - _coins, - _values, - _to, - _native_amt - ), - "revert" - ); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _query - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it(`Scenario 2: User has set approval, but user's balance has insufficient amount`, async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _coins = [_coin1, _coin2]; - let _values = [600000, 9999999999999999n]; - let _native_amt = 700000; - let _query = [_native, _coin1, _coin2]; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - coinId1 = await bts_coreV2.coinId(_coin1); - coinId2 = await bts_coreV2.coinId(_coin2); - await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); - await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_coreV2.address, - _coins, - _values, - _to, - _native_amt - ), - "revert" - ); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _query - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it("Scenario 3: User requests to transfer an invalid Token", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let invalid_token = "EOS"; - let _coins = [_coin1, invalid_token]; - let _values = [600000, 700000]; - let _native_amt = 800000; - let _query = [_native, _coin1, invalid_token]; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - coinId1 = await bts_coreV2.coinId(_coins[0]); - coinId2 = await bts_coreV2.coinId(_coins[1]); - await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); - // await holder.setApprove(coinId2, bts_coreV2.address,_values[1]); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_coreV2.address, - _coins, - _values, - _to, - _native_amt - ), - "revert" - ); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _query - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it("Scenario 4: User transfers Tokens to an invalid BTP Address format", async () => { - let _to = "1234.iconee/0x12345678"; - let _coins = [_coin1, _coin2]; - let _values = [600000, 700000]; - let _query = [_native, _coin1, _coin2]; - let _native_amt = 800000; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - coinId1 = await bts_coreV2.coinId(_coins[0]); - coinId2 = await bts_coreV2.coinId(_coins[1]); - await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); - await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_coreV2.address, - _coins, - _values, - _to, - _native_amt - ), - "revert" - ); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _query - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it("Scenario 5: User requests to transfer zero Token", async () => { - let _to = "1234.iconee/0x12345678"; - let _coins = [_coin1, _coin2]; - let _values = [600000, 0]; - let _query = [_native, _coin1, _coin2]; - let _native_amt = 800000; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - coinId1 = await bts_coreV2.coinId(_coin1); - coinId2 = await bts_coreV2.coinId(_coin2); - await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); - await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_coreV2.address, - _coins, - _values, - _to, - _native_amt - ), - "revert" - ); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _query - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it("Scenario 6: Transffering amount is less than fixed fee", async () => { - let _to = "1234.iconee/0x12345678"; - let _coins = [_coin1, _coin2]; - let _values = [600000, 300000]; - let _query = [_native, _coin1, _coin2]; - let _native_amt = 800000; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - coinId1 = await bts_coreV2.coinId(_coin1); - coinId2 = await bts_coreV2.coinId(_coin2); - await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); - await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_coreV2.address, - _coins, - _values, - _to, - _native_amt - ), - "revert" - ); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _query - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it("Scenario 7: User requests to transfer to an invalid network/Not Supported Network", async () => { - let _to = "btp://1234.eos/0x12345678"; - let _coins = [_coin1, _coin2]; - let _values = [600000, 700000]; - let _query = [_native, _coin1, _coin2]; - let _native_amt = 800000; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - coinId1 = await bts_coreV2.coinId(_coin1); - coinId2 = await bts_coreV2.coinId(_coin2); - await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); - await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_coreV2.address, - _coins, - _values, - _to, - _native_amt - ), - "revert" - ); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _query - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it("Scenario 8: Account client sends an invalid request of transferBatch", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _coins = [_native, _native, _native]; - let _values = [600000, 600000, 600000]; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - accounts[2], - _coins - ); - await truffleAssert.reverts( - bts_coreV2.transferBatch.call(_coins, _values, _to, { - from: accounts[2], - value: 600000, - }), - "revert" - ); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - accounts[2], - _coins - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _coins - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - initAmt - ); - }); - - it("Scenario 9: Contract client sends an invalid request of transferBatch", async () => { - let _to = "btp://1234.eos/0x12345678"; - let _coins = [_native, _coin1, _coin2]; - let _values = [600000, 700000]; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - holder.address, - _coins - ); - coinId1 = await bts_coreV2.coinId(_coin1); - coinId2 = await bts_coreV2.coinId(_coin2); - await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); - await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_coreV2.address, - _coins, - _values, - _to, - 0 - ), - "revert" - ); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - holder.address, - _coins - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _coins - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it("Scenario 10: Contract client sends a valid transferBatch request", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _coins = [_coin1, _coin2]; - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _values = [_value2, _value3]; - let _query = [_native, _coin1, _coin2]; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - coinId1 = await bts_coreV2.coinId(_coin1); - coinId2 = await bts_coreV2.coinId(_coin2); - await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); - await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); - let tx = await holder.callTransferBatch( - bts_coreV2.address, - _coins, - _values, - _to, - _value1 - ); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _query - ); - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferStart", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, holder.address); - assert.equal(event._to, _to); - assert.equal(event._sn, 2); - assert.equal(event._assetDetails.length, 3); - assert.equal(event._assetDetails[0].coinName, _coin1); - assert.equal(event._assetDetails[0].value, _value2 - chargedFee2); - assert.equal(event._assetDetails[0].fee, chargedFee2); - assert.equal(event._assetDetails[1].coinName, _coin2); - assert.equal(event._assetDetails[1].value, _value3 - chargedFee3); - assert.equal(event._assetDetails[1].fee, chargedFee3); - assert.equal(event._assetDetails[2].coinName, _native); - assert.equal(event._assetDetails[2].value, _value1 - chargedFee1); - assert.equal(event._assetDetails[2].fee, chargedFee1); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 2); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - holder.address - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _coin1 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - _value2 - chargedFee2 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), - _coin2 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), - _value3 - chargedFee3 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), - _native - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), - _value1 - chargedFee1 - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - - _value3 - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt + _value1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - _value3 - ); - }); - - it("Scenario 11: BTSPeriphery receives a successful response of a recent request", async () => { - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _coins = [_native, _coin1, _coin2]; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - holder.address, - _coins - ); - let _responseMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_OK, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 2, _responseMsg); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - holder.address, - _coins - ); - let fees = await bts_coreV2.getAccumulatedFees(); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _coins - ); - - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferEnd", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, holder.address); - assert.equal(event._sn, 2); - assert.equal(event._code, 0); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal(fees[0].coinName, _native); - assert.equal(Number(fees[0].value), chargedFee1); - assert.equal(fees[1].coinName, _coin1); - assert.equal(Number(fees[1].value), chargedFee2); - assert.equal(fees[2].coinName, _coin2); - assert.equal(Number(fees[2].value), chargedFee3); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt + _value1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - chargedFee2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - chargedFee3 - ); - }); - - it("Scenario 12: Account client sends a valid transferBatch request", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _coins = [_coin3, _coin1, _coin2]; - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _values = [_value1, _value2, _value3]; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - accounts[1], - _coins - ); - coinId1 = await bts_coreV2.coinId(_coins[0]); - coinId2 = await bts_coreV2.coinId(_coins[1]); - coinId3 = await bts_coreV2.coinId(_coins[2]); - let ERC20Tradable1 = await ERC20Tradable.at(coinId1); - let ERC20Tradable2 = await ERC20Tradable.at(coinId2); - let ERC20Tradable3 = await ERC20Tradable.at(coinId3); - await ERC20Tradable1.approve(bts_coreV2.address, _values[0], { - from: accounts[1], - }); - await ERC20Tradable2.approve(bts_coreV2.address, _values[1], { - from: accounts[1], - }); - await ERC20Tradable3.approve(bts_coreV2.address, _values[2], { - from: accounts[1], - }); - let tx = await bts_coreV2.transferBatch(_coins, _values, _to, { - from: accounts[1], - }); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - accounts[1], - _coins - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _coins - ); - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferStart", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, accounts[1]); - assert.equal(event._to, _to); - assert.equal(event._sn, 3); - assert.equal(event._assetDetails.length, 3); - assert.equal(event._assetDetails[0].coinName, _coin3); - assert.equal(event._assetDetails[0].value, _value1 - chargedFee1); - assert.equal(event._assetDetails[0].fee, chargedFee1); - assert.equal(event._assetDetails[1].coinName, _coin1); - assert.equal(event._assetDetails[1].value, _value2 - chargedFee2); - assert.equal(event._assetDetails[1].fee, chargedFee2); - assert.equal(event._assetDetails[2].coinName, _coin2); - assert.equal(event._assetDetails[2].value, _value3 - chargedFee3); - assert.equal(event._assetDetails[2].fee, chargedFee3); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 3); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - accounts[1] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _coin3 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - _value1 - chargedFee1 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), - _coin1 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), - _value2 - chargedFee2 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), - _coin2 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), - _value3 - chargedFee3 - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - - _value3 - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - _value2 + chargedFee2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - _value3 + chargedFee3 - ); - }); - - it("Scenario 13: BTSPeriphery receives an error response of a recent request", async () => { - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _coins = [_coin3, _coin1, _coin2]; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - accounts[1], - _coins - ); - let _responseMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 3, _responseMsg); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - accounts[1], - _coins - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _coins - ); - - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferEnd", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, accounts[1]); - assert.equal(event._sn, 3); - assert.equal(event._code, 1); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() + - _value1 - - chargedFee1 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() + - _value2 - - chargedFee2 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() + - _value3 - - chargedFee3 - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - chargedFee1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 2 * chargedFee2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 2 * chargedFee3 - ); - }); - - it("Scenario 14: Contract client sends a valid transferBatch request", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _coins = [_coin3, _coin1, _coin2]; - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _values = [_value1, _value2, _value3]; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - holder.address, - _coins - ); - coinId1 = await bts_coreV2.coinId(_coins[0]); - coinId2 = await bts_coreV2.coinId(_coins[1]); - coinId3 = await bts_coreV2.coinId(_coins[2]); - await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); - await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); - await holder.setApprove(coinId3, bts_coreV2.address, _values[2]); - let tx = await holder.callTransferBatch( - bts_coreV2.address, - _coins, - _values, - _to, - 0 - ); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - holder.address, - _coins - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _coins - ); - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferStart", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, holder.address); - assert.equal(event._to, _to); - assert.equal(event._sn, 4); - assert.equal(event._assetDetails.length, 3); - assert.equal(event._assetDetails[0].coinName, _coin3); - assert.equal(event._assetDetails[0].value, _value1 - chargedFee1); - assert.equal(event._assetDetails[0].fee, chargedFee1); - assert.equal(event._assetDetails[1].coinName, _coin1); - assert.equal(event._assetDetails[1].value, _value2 - chargedFee2); - assert.equal(event._assetDetails[1].fee, chargedFee2); - assert.equal(event._assetDetails[2].coinName, _coin2); - assert.equal(event._assetDetails[2].value, _value3 - chargedFee3); - assert.equal(event._assetDetails[2].fee, chargedFee3); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 4); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - holder.address - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _coin3 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - _value1 - chargedFee1 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), - _coin1 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), - _value2 - chargedFee2 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), - _coin2 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), - _value3 - chargedFee3 - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - - _value3 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - _value1 + chargedFee1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - _value2 + 2 * chargedFee2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - _value3 + 2 * chargedFee3 - ); - }); - - it("Scenario 15: BTSPeriphery receives an error response of a recent request", async () => { - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _coins = [_coin3, _coin1, _coin2]; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - holder.address, - _coins - ); - let _responseMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 4, _responseMsg); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - holder.address, - _coins - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _coins - ); - - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferEnd", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, holder.address); - assert.equal(event._sn, 4); - assert.equal(event._code, 1); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() + - _value1 - - chargedFee1 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() + - _value2 - - chargedFee2 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() + - _value3 - - chargedFee3 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - 2 * chargedFee1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 3 * chargedFee2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 3 * chargedFee3 - ); - }); - - // This test is replicated from Scenario 10 - it("Scenario 16: Contract client sends a valid transferBatch request", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _coins = [_coin1, _coin2]; - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _values = [_value2, _value3]; - let _query = [_native, _coin1, _coin2]; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - coinId1 = await bts_coreV2.coinId(_coins[0]); - coinId2 = await bts_coreV2.coinId(_coins[1]); - await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); - await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); - let tx = await holder.callTransferBatch( - bts_coreV2.address, - _coins, - _values, - _to, - _value1 - ); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _query - ); - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferStart", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, holder.address); - assert.equal(event._to, _to); - assert.equal(event._sn, 5); - assert.equal(event._assetDetails.length, 3); - assert.equal(event._assetDetails[0].coinName, _coin1); - assert.equal(event._assetDetails[0].value, _value2 - chargedFee2); - assert.equal(event._assetDetails[0].fee, chargedFee2); - assert.equal(event._assetDetails[1].coinName, _coin2); - assert.equal(event._assetDetails[1].value, _value3 - chargedFee3); - assert.equal(event._assetDetails[1].fee, chargedFee3); - assert.equal(event._assetDetails[2].coinName, _native); - assert.equal(event._assetDetails[2].value, _value1 - chargedFee1); - assert.equal(event._assetDetails[2].fee, chargedFee1); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 5); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - holder.address - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _coin1 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - _value2 - chargedFee2 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), - _coin2 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), - _value3 - chargedFee3 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), - _native - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), - _value1 - chargedFee1 - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - - _value3 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt + 2 * _value1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - _value2 + 3 * chargedFee2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - _value3 + 3 * chargedFee3 - ); - }); - - it("Scenario 17: BTSPeriphery receives an error response of a recent request", async () => { - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _coins = [_native, _coin1, _coin2]; - let balanceBefore = await bts_coreV2.getBalanceOfBatch( - holder.address, - _coins - ); - let _responseMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 5, _responseMsg); - let balanceAfter = await bts_coreV2.getBalanceOfBatch( - holder.address, - _coins - ); - let bts_core_balance = await bts_coreV2.getBalanceOfBatch( - bts_coreV2.address, - _coins - ); - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_peripheryV2.getPastEvents( - "TransferEnd", - { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, holder.address); - assert.equal(event._sn, 5); - assert.equal(event._code, 1); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() + - _value2 - - chargedFee2 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() + - _value3 - - chargedFee3 - ); - assert.equal( - web3.utils.BN(balanceBefore._refundableBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._refundableBalances[0]).toNumber(), - _value1 - chargedFee1 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt + 2 * _value1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 4 * chargedFee2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 4 * chargedFee3 - ); - }); - }); -}); +// // const BTSPeripheryV1 = artifacts.require("BTSPeripheryV1"); +// // const BTSPeripheryV2 = artifacts.require("BTSPeripheryV2"); +// const BTSCoreTestV1 = artifacts.require("BTSCore"); +// const BTSCoreTestV2 = artifacts.require("MockBTSCore"); +// const BMC = artifacts.require("MockBMC"); +// // const Holder = artifacts.require("AnotherHolder"); +// const NotPayable = artifacts.require("NotPayable"); +// const NonRefundable = artifacts.require("NonRefundable"); +// const Refundable = artifacts.require("Refundable"); +// const EncodeMsg = artifacts.require("EncodeMessage"); +// const ERC20Tradable = artifacts.require("ERC20Tradable"); +// const { assert } = require("chai"); +// const truffleAssert = require("truffle-assertions"); +// const { deployProxy, upgradeProxy } = require("@openzeppelin/truffle-upgrades"); +// const rlp = require("rlp"); +// +// let toHex = (buf) => { +// buf = buf.toString("hex"); +// if (buf.substring(0, 2) == "0x") return buf; +// return "0x" + buf.toString("hex"); +// }; +// +// // All of these unit tests below check upgradability of smart contract using Openzeppelin Library and SDK +// // BSHService and BSHCoin contracts have two versions +// // These two versions cover many upgradeable features: +// // - Adding additional state variables +// // - Adding additional functions +// contract("NativeCoinBSH contracts - After Upgrading Contract", (accounts) => { +// describe("PRA BTSCore Query and Management - After Upgrading Contract", () => { +// let bts_peripheryV1, bts_peripheryV2, bts_coreV1, bts_coreV2; +// let _native = "PARA"; +// let _fee = 10; +// let _fixed_fee = 500000; +// let service = "Coin/WrappedCoin"; +// let _net = "1234.iconee"; +// let _bmcICON = "btp://1234.iconee/0x1234567812345678"; +// let REPONSE_HANDLE_SERVICE = 2; +// let RC_OK = 0; +// +// before(async () => { +// bmc = await BMC.new("1234.pra"); +// bts_coreV1 = await deployProxy(BTSCoreTestV1, [ +// _native, +// _fee, +// _fixed_fee, +// ]); +// bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ +// bmc.address, +// bts_coreV1.address, +// service, +// ]); +// encode_msg = await EncodeMsg.new(); +// await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); +// bts_peripheryV2 = await upgradeProxy( +// bts_peripheryV1.address, +// BTSPeripheryV2 +// ); +// bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); +// await bmc.addService(service, bts_peripheryV2.address); +// await bmc.addVerifier(_net, accounts[1]); +// await bmc.addLink(_bmcICON); +// }); +// +// it(`Scenario 1: Contract's owner to register a new coin`, async () => { +// let _name = "ICON"; +// await bts_coreV2.register(_name, "", 18); +// output = await bts_coreV2.coinNames(); +// assert(output[0] === _native && output[1] === "ICON"); +// }); +// +// it("Scenario 2: Non-ownership role client registers a new coin", async () => { +// let _name = "TRON"; +// await truffleAssert.reverts( +// bts_coreV2.register.call(_name, "", 18, { from: accounts[1] }), +// "Unauthorized" +// ); +// }); +// +// it("Scenario 3: Contract’s owner registers an existed coin", async () => { +// let _name = "ICON"; +// await truffleAssert.reverts( +// bts_coreV2.register.call(_name), +// "ExistCoin" +// ); +// }); +// +// it("Scenario 4: Contract’s owner to update BTSPeriphery contract", async () => { +// await bts_coreV2.updateBTSPeriphery(bts_peripheryV2.address); +// }); +// +// it("Scenario 5: Non-ownership role client updates BTSPeriphery contract", async () => { +// await truffleAssert.reverts( +// bts_coreV2.updateBTSPeriphery.call(bts_peripheryV2.address, { +// from: accounts[1], +// }), +// "Unauthorized" +// ); +// }); +// +// it("Scenario 6: Contract’s owner updates BTSPeriphery while this contract has pending requests", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// await bts_coreV2.transferNativeCoin(_to, { +// from: accounts[0], +// value: 100000000, +// }); +// await truffleAssert.reverts( +// bts_coreV2.updateBTSPeriphery.call(accounts[2]), +// "HasPendingRequest" +// ); +// // Clear pending request +// let _msg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_OK, +// "" +// ); +// await bmc.receiveResponse(_net, service, 1, _msg); +// }); +// +// it.skip("Scenario 7: Contract’s owner updates a new URI", async () => { +// // new URI no longer available +// }); +// +// it.skip("Scenario 8: Non-ownership role client updates a new URI", async () => { +// // new URI no longer available +// }); +// +// it(`Scenario 9: Contract's owner updates fee ratio`, async () => { +// let new_fee = 20; +// await bts_coreV2.setFeeRatio(new_fee); +// +// assert( +// web3.utils.BN(await bts_coreV2.feeNumerator()).toNumber() === +// new_fee +// ); +// }); +// +// it("Scenario 10: Non-ownership role client updates fee ratio", async () => { +// let old_fee = 20; +// let new_fee = 50; +// await truffleAssert.reverts( +// bts_coreV2.setFeeRatio.call(new_fee, { from: accounts[1] }), +// "Unauthorized" +// ); +// +// assert( +// web3.utils.BN(await bts_coreV2.feeNumerator()).toNumber() === +// old_fee +// ); +// }); +// +// it("Scenario 11: Fee Numerator is set higher than Fee Denominator", async () => { +// let old_fee = 20; +// let new_fee = 20000; +// await truffleAssert.reverts( +// bts_coreV2.setFeeRatio.call(new_fee), +// "InvalidSetting" +// ); +// +// assert( +// web3.utils.BN(await bts_coreV2.feeNumerator()).toNumber() === +// old_fee +// ); +// }); +// +// it("Scenario 12: Contract owner updates fixed fee", async () => { +// let new_fixed_fee = 1000000; +// await bts_coreV2.setFixedFee(new_fixed_fee); +// +// assert( +// web3.utils.BN(await bts_coreV2.fixedFee()).toNumber() === +// new_fixed_fee +// ); +// }); +// +// it("Scenario 13: Non-ownership role client updates fixed fee", async () => { +// let old_fixed_fee = 1000000; +// let new_fixed_fee = 2000000; +// await truffleAssert.reverts( +// bts_coreV2.setFixedFee.call(new_fixed_fee, { +// from: accounts[1], +// }), +// "Unauthorized" +// ); +// +// assert( +// web3.utils.BN(await bts_coreV2.fixedFee()).toNumber() === +// old_fixed_fee +// ); +// }); +// +// it("Scenario 14: Owner set fixed fee is zero", async () => { +// let old_fixed_fee = 1000000; +// let new_fixed_fee = 0; +// await truffleAssert.reverts( +// bts_coreV2.setFixedFee.call(new_fixed_fee), +// "InvalidSetting" +// ); +// +// assert( +// web3.utils.BN(await bts_coreV2.fixedFee()).toNumber() === +// old_fixed_fee +// ); +// }); +// +// it("Scenario 15: Query a valid supporting coin", async () => { +// let _name1 = "wBTC"; +// let _name2 = "Ethereum"; +// await bts_coreV2.register(_name1, "", 18); +// await bts_coreV2.register(_name2, "", 18); +// let _query = "ICON"; +// let result = await bts_coreV2.coinId(_query); +// assert( +// web3.utils.toChecksumAddress(result) !== +// web3.utils.toChecksumAddress( +// "0x0000000000000000000000000000000000000000" +// ) +// ); +// }); +// +// it("Scenario 16: Query an invalid supporting coin", async () => { +// let _query = "EOS"; +// let result = await bts_coreV2.coinId(_query); +// assert( +// web3.utils.toChecksumAddress(result) === +// web3.utils.toChecksumAddress( +// "0x0000000000000000000000000000000000000000" +// ) +// ); +// }); +// +// it("Scenario 17: Non-Owner tries to add a new Owner", async () => { +// let oldList = await bts_coreV2.getOwners(); +// await truffleAssert.reverts( +// bts_coreV2.addOwner.call(accounts[1], { from: accounts[2] }), +// "Unauthorized" +// ); +// let newList = await bts_coreV2.getOwners(); +// assert( +// oldList.length === 1 && +// oldList[0] === accounts[0] && +// newList.length === 1 && +// newList[0] === accounts[0] +// ); +// }); +// +// it("Scenario 18: Current Owner adds a new Owner", async () => { +// let oldList = await bts_coreV2.getOwners(); +// await bts_coreV2.addOwner(accounts[1]); +// let newList = await bts_coreV2.getOwners(); +// assert( +// oldList.length === 1 && +// oldList[0] === accounts[0] && +// newList.length === 2 && +// newList[0] === accounts[0] && +// newList[1] === accounts[1] +// ); +// }); +// +// it("Scenario 19: After adding a new Owner, owner registers a new coin", async () => { +// let _name3 = "TRON"; +// await bts_coreV2.register(_name3, "", 18); +// output = await bts_coreV2.coinNames(); +// assert( +// output[0] === _native && +// output[1] === "ICON" && +// output[2] === "wBTC" && +// output[3] === "Ethereum" && +// output[4] === "TRON" +// ); +// }); +// +// it("Scenario 20: New Owner registers a new coin", async () => { +// let _name3 = "BINANCE"; +// await bts_coreV2.register(_name3, "", 18, { from: accounts[1] }); +// output = await bts_coreV2.coinNames(); +// assert( +// output[0] === _native && +// output[1] === "ICON" && +// output[2] === "wBTC" && +// output[3] === "Ethereum" && +// output[4] === "TRON" && +// output[5] === "BINANCE" +// ); +// }); +// +// it("Scenario 21: New owner updates BTSPeriphery contract", async () => { +// let newBTSPeriphery = await BTSPeripheryV2.new(); +// await bts_coreV2.updateBTSPeriphery(newBTSPeriphery.address, { +// from: accounts[1], +// }); +// }); +// +// it("Scenario 22: Old owner updates BTSPeriphery contract", async () => { +// let newBTSPeriphery = await BTSPeripheryV2.new(); +// await bts_coreV2.updateBTSPeriphery(newBTSPeriphery.address, { +// from: accounts[0], +// }); +// }); +// +// it.skip("Scenario 23: New owner updates the new URI", async () => { +// // new URI no longer available +// }); +// +// it.skip("Scenario 24: Old owner updates the new URI", async () => { +// // new URI no longer available +// }); +// +// it("Scenario 25: New owner updates new fee ratio", async () => { +// let new_fee = 30; +// await bts_coreV2.setFeeRatio(new_fee, { from: accounts[1] }); +// +// assert( +// web3.utils.BN(await bts_coreV2.feeNumerator()).toNumber() === +// new_fee +// ); +// }); +// +// it("Scenario 26: Old owner updates new fee ratio - After adding new Owner", async () => { +// let new_fee = 40; +// await bts_coreV2.setFeeRatio(new_fee, { from: accounts[0] }); +// +// assert( +// web3.utils.BN(await bts_coreV2.feeNumerator()).toNumber() === +// new_fee +// ); +// }); +// +// it("Scenario 27: New owner updates new fixed fee", async () => { +// let new_fixed_fee = 3000000; +// await bts_coreV2.setFixedFee(new_fixed_fee, { from: accounts[1] }); +// +// assert( +// web3.utils.BN(await bts_coreV2.fixedFee()).toNumber() === +// new_fixed_fee +// ); +// }); +// +// it("Scenario 28: Old owner updates new fixed fee - After adding new Owner", async () => { +// let new_fixed_fee = 4000000; +// await bts_coreV2.setFixedFee(new_fixed_fee, { from: accounts[0] }); +// +// assert( +// web3.utils.BN(await bts_coreV2.fixedFee()).toNumber() === +// new_fixed_fee +// ); +// }); +// +// it("Scenario 29: Non-Owner tries to remove an Owner", async () => { +// let oldList = await bts_coreV2.getOwners(); +// await truffleAssert.reverts( +// bts_coreV2.removeOwner.call(accounts[0], { from: accounts[2] }), +// "Unauthorized" +// ); +// let newList = await bts_coreV2.getOwners(); +// assert( +// oldList.length === 2 && +// oldList[0] === accounts[0] && +// oldList[1] === accounts[1] && +// newList.length === 2 && +// newList[0] === accounts[0] && +// newList[1] === accounts[1] +// ); +// }); +// +// it("Scenario 30: Current Owner removes another Owner", async () => { +// let oldList = await bts_coreV2.getOwners(); +// await bts_coreV2.removeOwner(accounts[0], { from: accounts[1] }); +// let newList = await bts_coreV2.getOwners(); +// assert( +// oldList.length === 2 && +// oldList[0] === accounts[0] && +// oldList[1] === accounts[1] && +// newList.length === 1 && +// newList[0] === accounts[1] +// ); +// }); +// +// it("Scenario 31: The last Owner removes him/herself", async () => { +// let oldList = await bts_coreV2.getOwners(); +// await truffleAssert.reverts( +// bts_coreV2.removeOwner.call(accounts[1], { from: accounts[1] }), +// "Unable to remove last Owner" +// ); +// let newList = await bts_coreV2.getOwners(); +// assert( +// oldList.length === 1 && +// oldList[0] === accounts[1] && +// newList.length === 1 && +// newList[0] === accounts[1] +// ); +// }); +// +// it("Scenario 32: Removed Owner tries to register a new coin", async () => { +// let _name3 = "KYBER"; +// await truffleAssert.reverts( +// bts_coreV2.register.call(_name3, "", 18), +// "Unauthorized" +// ); +// output = await bts_coreV2.coinNames(); +// assert( +// output[0] === _native && +// output[1] === "ICON" && +// output[2] === "wBTC" && +// output[3] === "Ethereum" && +// output[4] === "TRON" && +// output[5] === "BINANCE" +// ); +// }); +// +// it("Scenario 33: Removed Owner tries to update BTSPeriphery contract", async () => { +// await truffleAssert.reverts( +// bts_coreV2.updateBTSPeriphery.call(accounts[3], { +// from: accounts[0], +// }), +// "Unauthorized" +// ); +// }); +// +// it.skip("Scenario 34: Removed Owner tries to update the new URI", async () => { +// // new URI no longer available +// }); +// +// it("Scenario 35: Removed Owner tries to update new fee ratio", async () => { +// let new_fee = 30; +// await truffleAssert.reverts( +// bts_coreV2.setFeeRatio.call(new_fee, { from: accounts[0] }), +// "Unauthorized" +// ); +// }); +// }); +// +// describe("As a user, I want to send PRA to ICON blockchain - After Upgrading Contract", () => { +// let bts_peripheryV1, +// bts_peripheryV2, +// bts_coreV1, +// bts_coreV2, +// bmc, +// nonrefundable, +// refundable; +// let service = "Coin/WrappedCoin"; +// let _bmcICON = "btp://1234.iconee/0x1234567812345678"; +// let _net = "1234.iconee"; +// let _to = "btp://1234.iconee/0x12345678"; +// let RC_OK = 0; +// let RC_ERR = 1; +// let _fixed_fee = 500000; +// let deposit = 1000000000000; +// let _native = "PARA"; +// let _fee = 10; +// let REPONSE_HANDLE_SERVICE = 2; +// let _uri = "https://github.com/icon-project/icon-bridge"; +// +// before(async () => { +// bmc = await BMC.new("1234.pra"); +// bts_coreV1 = await deployProxy(BTSCoreTestV1, [ +// _native, +// _fee, +// _fixed_fee, +// ]); +// bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ +// bmc.address, +// bts_coreV1.address, +// service, +// ]); +// encode_msg = await EncodeMsg.new(); +// await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); +// await bmc.addService(service, bts_peripheryV1.address); +// bts_peripheryV2 = await upgradeProxy( +// bts_peripheryV1.address, +// BTSPeripheryV2 +// ); +// bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); +// nonrefundable = await NonRefundable.new(); +// refundable = await Refundable.new(); +// await bmc.addVerifier(_net, accounts[1]); +// await bmc.addLink(_bmcICON); +// }); +// +// it("Scenario 1: Transferring native coins to an invalid BTP Address format", async () => { +// let invalid_destination = "1234.iconee/0x12345678"; +// let amount = 600000; +// await truffleAssert.reverts( +// bts_coreV2.transferNativeCoin.call(invalid_destination, { +// from: accounts[0], +// value: amount, +// }), +// "revert" +// ); +// bts_coin_balance = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _native +// ); +// account_balance = await bts_coreV2.getBalanceOf( +// accounts[0], +// _native +// ); +// assert( +// web3.utils.BN(bts_coin_balance._usableBalance).toNumber() === +// 0 && +// web3.utils.BN(account_balance._lockedBalance).toNumber() === +// 0 +// ); +// }); +// +// it("Scenario 2: Transferring zero coin", async () => { +// await truffleAssert.reverts( +// bts_coreV2.transferNativeCoin.call(_to, { +// from: accounts[0], +// value: 0, +// }), +// "revert" +// ); +// }); +// +// it("Scenario 3: msg.value less than fixed_fee", async () => { +// // fixed_fee = 500000; +// let amount = 100000; +// await truffleAssert.reverts( +// bts_coreV2.transferNativeCoin.call(_to, { +// from: accounts[0], +// value: amount, +// }), +// "revert" +// ); +// }); +// +// it("Scenario 4: Transferring to an invalid network/not supported network", async () => { +// let invalid_destination = "btp://1234.eos/0x12345678"; +// let amount = 600000; +// await truffleAssert.reverts( +// bts_coreV2.transferNativeCoin.call(invalid_destination, { +// from: accounts[1], +// value: amount, +// }), +// "BMCRevertNotExistsBMV" +// ); +// }); +// +// it("Scenario 5: Account client transfers a valid native coin to a side chain", async () => { +// let amount = 600000; +// let account_balanceBefore = await bts_coreV2.getBalanceOf( +// accounts[0], +// _native +// ); +// let tx = await bts_coreV2.transferNativeCoin(_to, { +// from: accounts[0], +// value: amount, +// }); +// let account_balanceAfter = await bts_coreV2.getBalanceOf( +// accounts[0], +// _native +// ); +// let bts_coin_balance = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _native +// ); +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferStart", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, accounts[0]); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 1); +// assert.equal(event._assetDetails.length, 1); +// assert.equal(event._assetDetails[0].coinName, "PARA"); +// assert.equal(event._assetDetails[0].value, amount - chargedFee); +// assert.equal(event._assetDetails[0].fee, chargedFee); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 1); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// accounts[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _native +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// amount - chargedFee +// ); +// +// assert( +// web3.utils.BN(bts_coin_balance._usableBalance).toNumber() === +// amount && +// web3.utils +// .BN(account_balanceBefore._lockedBalance) +// .toNumber() === 0 && +// web3.utils +// .BN(account_balanceAfter._lockedBalance) +// .toNumber() === amount +// ); +// }); +// +// it("Scenario 6: BTSPeriphery receives a successful response of a recent request", async () => { +// let amount = 600000; +// let account_balanceBefore = await bts_coreV2.getBalanceOf( +// accounts[0], +// _native +// ); +// let _msg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_OK, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 1, _msg); +// let account_balanceAfter = await bts_coreV2.getBalanceOf( +// accounts[0], +// _native +// ); +// let fees = await bts_coreV2.getAccumulatedFees(); +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferEnd", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, accounts[0]); +// assert.equal(event._sn, 1); +// assert.equal(event._code, 0); +// assert.equal(event._response, ""); +// +// assert( +// fees[0].coinName === _native && +// Number(fees[0].value) === +// Math.floor(amount / 1000) + _fixed_fee && +// web3.utils +// .BN(account_balanceBefore._lockedBalance) +// .toNumber() === amount && +// web3.utils +// .BN(account_balanceAfter._lockedBalance) +// .toNumber() === 0 +// ); +// }); +// +// it("Scenario 5: Account client transfers a valid native coin to a side chain", async () => { +// let amount = 600000; +// let account_balanceBefore = await bts_coreV2.getBalanceOf( +// accounts[0], +// _native +// ); +// let tx = await bts_coreV2.transferNativeCoin(_to, { +// from: accounts[0], +// value: amount, +// }); +// let account_balanceAfter = await bts_coreV2.getBalanceOf( +// accounts[0], +// _native +// ); +// let bts_coin_balance = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _native +// ); +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferStart", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, accounts[0]); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 2); +// assert.equal(event._assetDetails.length, 1); +// assert.equal(event._assetDetails[0].coinName, "PARA"); +// assert.equal(event._assetDetails[0].value, amount - chargedFee); +// assert.equal(event._assetDetails[0].fee, chargedFee); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 2); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// accounts[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _native +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// amount - chargedFee +// ); +// +// assert( +// web3.utils.BN(bts_coin_balance._usableBalance).toNumber() === +// 2 * amount && +// web3.utils +// .BN(account_balanceBefore._lockedBalance) +// .toNumber() === 0 && +// web3.utils +// .BN(account_balanceAfter._lockedBalance) +// .toNumber() === amount +// ); +// }); +// +// it("Scenario 7: BTSPeriphery receives an error response of a recent request", async () => { +// let amount = 600000; +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// let account_balanceBefore = await bts_coreV2.getBalanceOf( +// accounts[0], +// _native +// ); +// let bts_coin_balance_before = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _native +// ); +// let _msg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_ERR, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 2, _msg); +// let account_balanceAfter = await bts_coreV2.getBalanceOf( +// accounts[0], +// _native +// ); +// let bts_coin_balance_after = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _native +// ); +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferEnd", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, accounts[0]); +// assert.equal(event._sn, 2); +// assert.equal(event._code, 1); +// assert.equal(event._response, ""); +// +// // Unable to check balance of accounts[0] since this account has also paid gas fee +// // It would be easier to check if this is a contract +// // Requestor will be receive an amount of refund as +// // refund = amount - chargeAmt +// assert( +// web3.utils +// .BN(account_balanceBefore._lockedBalance) +// .toNumber() === amount && +// web3.utils +// .BN(account_balanceAfter._lockedBalance) +// .toNumber() === 0 && +// web3.utils +// .BN(account_balanceAfter._refundableBalance) +// .toNumber() === 0 && +// web3.utils +// .BN(bts_coin_balance_before._usableBalance) +// .toNumber() === +// 2 * amount && +// web3.utils +// .BN(bts_coin_balance_after._usableBalance) +// .toNumber() === +// amount + chargedFee +// ); +// }); +// +// it("Scenario 8: Non-refundable contract transfers a valid native coin to a side chain", async () => { +// let amount = 600000; +// await nonrefundable.deposit({ from: accounts[2], value: deposit }); +// let contract_balanceBefore = await bts_coreV2.getBalanceOf( +// nonrefundable.address, +// _native +// ); +// let bts_coin_balance_before = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _native +// ); +// let tx = await nonrefundable.transfer( +// bts_coreV2.address, +// _to, +// amount +// ); +// let contract_balanceAfter = await bts_coreV2.getBalanceOf( +// nonrefundable.address, +// _native +// ); +// let bts_coin_balance_after = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _native +// ); +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferStart", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, nonrefundable.address); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 3); +// assert.equal(event._assetDetails.length, 1); +// assert.equal(event._assetDetails[0].coinName, "PARA"); +// assert.equal(event._assetDetails[0].value, amount - chargedFee); +// assert.equal(event._assetDetails[0].fee, chargedFee); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 3); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// nonrefundable.address +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _native +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// amount - chargedFee +// ); +// +// assert( +// web3.utils +// .BN(contract_balanceBefore._usableBalance) +// .toNumber() === +// web3.utils +// .BN(contract_balanceAfter._usableBalance) +// .toNumber() + +// amount && +// web3.utils +// .BN(contract_balanceBefore._lockedBalance) +// .toNumber() === 0 && +// web3.utils +// .BN(contract_balanceAfter._lockedBalance) +// .toNumber() === amount && +// web3.utils +// .BN(bts_coin_balance_before._usableBalance) +// .toNumber() === +// amount + chargedFee && +// web3.utils +// .BN(bts_coin_balance_after._usableBalance) +// .toNumber() === +// 2 * amount + chargedFee +// ); +// }); +// +// it(`Scenario 9: BTSPeriphery receives an error response of a recent request and fails to refund coins back to Non-refundable contract`, async () => { +// let amount = 600000; +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// let contract_balanceBefore = await bts_coreV2.getBalanceOf( +// nonrefundable.address, +// _native +// ); +// let bts_coin_balance_before = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _native +// ); +// let _msg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_ERR, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 3, _msg); +// let contract_balanceAfter = await bts_coreV2.getBalanceOf( +// nonrefundable.address, +// _native +// ); +// let bts_coin_balance_after = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _native +// ); +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferEnd", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, nonrefundable.address); +// assert.equal(event._sn, 3); +// assert.equal(event._code, 1); +// assert.equal(event._response, ""); +// +// assert.equal( +// web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), +// amount +// ); +// assert.equal( +// web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(contract_balanceBefore._usableBalance).toNumber(), +// web3.utils.BN(contract_balanceAfter._usableBalance).toNumber() +// ); +// assert.equal( +// web3.utils +// .BN(contract_balanceAfter._refundableBalance) +// .toNumber(), +// amount - chargedFee +// ); +// assert.equal( +// web3.utils +// .BN(bts_coin_balance_before._usableBalance) +// .toNumber(), +// web3.utils.BN(bts_coin_balance_after._usableBalance).toNumber() +// ); +// }); +// +// it("Scenario 10: Refundable contract transfers a valid native coin to a side chain", async () => { +// let amount = 600000; +// await refundable.deposit({ from: accounts[2], value: deposit }); +// let contract_balanceBefore = await bts_coreV2.getBalanceOf( +// refundable.address, +// _native +// ); +// let bts_coin_balance_before = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _native +// ); +// let tx = await refundable.transfer(bts_coreV2.address, _to, amount); +// let contract_balanceAfter = await bts_coreV2.getBalanceOf( +// refundable.address, +// _native +// ); +// let bts_coin_balance_after = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _native +// ); +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferStart", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, refundable.address); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 4); +// assert.equal(event._assetDetails.length, 1); +// assert.equal(event._assetDetails[0].coinName, "PARA"); +// assert.equal(event._assetDetails[0].value, amount - chargedFee); +// assert.equal(event._assetDetails[0].fee, chargedFee); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 4); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// refundable.address +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _native +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// amount - chargedFee +// ); +// +// assert.equal( +// web3.utils.BN(contract_balanceBefore._usableBalance).toNumber(), +// web3.utils.BN(contract_balanceAfter._usableBalance).toNumber() + +// amount +// ); +// assert.equal( +// web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), +// amount +// ); +// assert.equal( +// web3.utils.BN(bts_coin_balance_after._usableBalance).toNumber(), +// web3.utils +// .BN(bts_coin_balance_before._usableBalance) +// .toNumber() + amount +// ); +// }); +// +// it("Scenario 11: BTSPeriphery receives an error response of a recent request", async () => { +// let amount = 600000; +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// let contract_balanceBefore = await bts_coreV2.getBalanceOf( +// refundable.address, +// _native +// ); +// let bts_coin_balance_before = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _native +// ); +// let _msg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_ERR, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 4, _msg); +// let contract_balanceAfter = await bts_coreV2.getBalanceOf( +// refundable.address, +// _native +// ); +// let bts_coin_balance_after = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _native +// ); +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferEnd", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, refundable.address); +// assert.equal(event._sn, 4); +// assert.equal(event._code, 1); +// assert.equal(event._response, ""); +// +// assert.equal( +// web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), +// amount +// ); +// assert.equal( +// web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(contract_balanceAfter._usableBalance).toNumber(), +// web3.utils +// .BN(contract_balanceBefore._usableBalance) +// .toNumber() + +// amount - +// chargedFee +// ); +// assert.equal( +// web3.utils +// .BN(contract_balanceAfter._refundableBalance) +// .toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils +// .BN(bts_coin_balance_before._usableBalance) +// .toNumber(), +// web3.utils +// .BN(bts_coin_balance_after._usableBalance) +// .toNumber() + +// amount - +// chargedFee +// ); +// }); +// }); +// +// describe("As a user, I want to send ERC1155_ICX to ICON blockchain - After Upgrading Contract", () => { +// let bts_peripheryV1, +// bts_peripheryV2, +// bts_coreV1, +// bts_coreV2, +// bmc, +// holder, +// coinId; +// let service = "Coin/WrappedCoin"; +// let _uri = "https://github.com/icon-project/icon-bridge"; +// let _native = "PARA"; +// let _fee = 10; +// let _fixed_fee = 500000; +// let _name = "ICON"; +// let _bmcICON = "btp://1234.iconee/0x1234567812345678"; +// let _net = "1234.iconee"; +// let _from = "0x12345678"; +// let _value = 999999999999999; +// let REPONSE_HANDLE_SERVICE = 2; +// let RC_OK = 0; +// let RC_ERR = 1; +// +// before(async () => { +// bmc = await BMC.new("1234.pra"); +// bts_coreV1 = await deployProxy(BTSCoreTestV1, [ +// _native, +// _fee, +// _fixed_fee, +// ]); +// bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ +// bmc.address, +// bts_coreV1.address, +// service, +// ]); +// encode_msg = await EncodeMsg.new(); +// await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); +// await bmc.addService(service, bts_peripheryV1.address); +// bts_peripheryV2 = await upgradeProxy( +// bts_peripheryV1.address, +// BTSPeripheryV2 +// ); +// bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); +// holder = await Holder.new(); +// await bmc.addVerifier(_net, accounts[1]); +// await bmc.addLink(_bmcICON); +// await holder.addBSHContract( +// bts_peripheryV2.address, +// bts_coreV2.address +// ); +// await bts_coreV2.register(_name, "", 18); +// let _msg = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// holder.address, +// _name, +// _value +// ); +// await bmc.receiveRequest(_bmcICON, "", service, 0, _msg); +// coinId = await bts_coreV2.coinId(_name); +// }); +// +// it("Scenario 1: User has not yet set approval for token being transferred out by Operator", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _value = 600000; +// let balanceBefore = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// await truffleAssert.reverts( +// holder.callTransfer.call(_name, _value, _to), +// "ERC20: transfer amount exceeds allowance" +// ); +// let balanceAfter = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// }); +// +// it(`Scenario 2: User has set approval, but user's balance has insufficient amount`, async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _value = 9999999999999999n; +// let balanceBefore = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// await holder.setApprove(coinId, bts_coreV2.address, _value); +// await truffleAssert.reverts( +// holder.callTransfer.call(_name, _value, _to), +// "ERC20: transfer amount exceeds balance" +// ); +// let balanceAfter = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 3: User requests to transfer an invalid Token", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _value = 9999999999999999n; +// let _token = "EOS"; +// await holder.setApprove(coinId, bts_coreV2.address, _value); +// await truffleAssert.reverts( +// holder.callTransfer.call(_token, _value, _to), +// "UnregisterCoin" +// ); +// }); +// +// it("Scenario 4: User transfers Tokens to an invalid BTP Address format", async () => { +// let _to = "1234.iconee/0x12345678"; +// let amount = 600000; +// let contract_balanceBefore = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// await holder.setApprove(coinId, bts_coreV2.address, amount); +// await truffleAssert.reverts( +// holder.callTransfer.call(_name, amount, _to), +// "VM Exception while processing transaction: revert" +// ); +// let contract_balanceAfter = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _name +// ); +// +// assert.equal( +// web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(contract_balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(contract_balanceBefore._usableBalance).toNumber() +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalance).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 5: User requests to transfer zero Token", async () => { +// let _to = "1234.iconee/0x12345678"; +// let amount = 600000; +// let balanceBefore = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// await holder.setApprove(coinId, bts_coreV2.address, amount); +// await truffleAssert.reverts( +// holder.callTransfer.call(_name, 0, _to), +// "revert" +// ); +// let balanceAfter = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() +// ); +// }); +// +// it("Scenario 6: Transferring amount is less than fixed fee", async () => { +// let _to = "1234.iconee/0x12345678"; +// let _name = "ICON"; +// let amount = 100000; +// let balanceBefore = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// await holder.setApprove(coinId, bts_coreV2.address, amount); +// await truffleAssert.reverts( +// holder.callTransfer.call(_name, amount, _to), +// "revert" +// ); +// let balanceAfter = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() +// ); +// }); +// +// it("Scenario 7: User requests to transfer to an invalid network/Not Supported Network", async () => { +// let _to = "btp://1234.eos/0x12345678"; +// let _name = "ICON"; +// let amount = 600000; +// let balanceBefore = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// await holder.setApprove(coinId, bts_coreV2.address, amount); +// await truffleAssert.reverts( +// holder.callTransfer.call(_name, amount, _to), +// "BMCRevertNotExistsBMV" +// ); +// let balanceAfter = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _name +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalance).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 8: User sends a valid transferring request", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let amount = 600000; +// let balanceBefore = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// await holder.setApprove(coinId, bts_coreV2.address, amount); +// let tx = await holder.callTransfer(_name, amount, _to); +// let balanceAfter = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _name +// ); +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferStart", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, holder.address); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 1); +// assert.equal(event._assetDetails.length, 1); +// assert.equal(event._assetDetails[0].coinName, _name); +// assert.equal(event._assetDetails[0].value, amount - chargedFee); +// assert.equal(event._assetDetails[0].fee, chargedFee); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 1); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// holder.address +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _name +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// amount - chargedFee +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// amount +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() - amount +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalance).toNumber(), +// amount +// ); +// }); +// +// it("Scenario 9: BTSPeriphery receives a successful response of a recent request", async () => { +// let amount = 600000; +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// let contract_balanceBefore = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// let _msg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_OK, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 1, _msg); +// let contract_balanceAfter = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// let fees = await bts_coreV2.getAccumulatedFees(); +// let bts_core_balance = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _name +// ); +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferEnd", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, holder.address); +// assert.equal(event._sn, 1); +// assert.equal(event._code, 0); +// assert.equal(event._response, ""); +// +// assert.equal( +// web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), +// amount +// ); +// assert.equal( +// web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(contract_balanceBefore._usableBalance).toNumber(), +// web3.utils.BN(contract_balanceAfter._usableBalance).toNumber() +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalance).toNumber(), +// chargedFee +// ); +// assert.equal(fees[1].coinName, _name); +// assert.equal(Number(fees[1].value), chargedFee); +// }); +// +// it("Scenario 8: User sends a valid transferring request", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let amount = 100000000000000; +// let balanceBefore = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// let bts_core_balance_before = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _name +// ); +// await holder.setApprove(coinId, bts_coreV2.address, amount); +// let tx = await holder.callTransfer(_name, amount, _to); +// let balanceAfter = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// let bts_core_balance_after = await bts_coreV2.getBalanceOf( +// bts_coreV2.address, +// _name +// ); +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferStart", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, holder.address); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 2); +// assert.equal(event._assetDetails.length, 1); +// assert.equal(event._assetDetails[0].coinName, _name); +// assert.equal(event._assetDetails[0].value, amount - chargedFee); +// assert.equal(event._assetDetails[0].fee, chargedFee); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 2); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// holder.address +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _name +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// amount - chargedFee +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// amount +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() - amount +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance_after._usableBalance).toNumber(), +// web3.utils +// .BN(bts_core_balance_before._usableBalance) +// .toNumber() + amount +// ); +// }); +// +// it("Scenario 10: BTSPeriphery receives an error response of a recent request", async () => { +// let amount = 100000000000000; +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// let balanceBefore = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// let _msg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_ERR, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 2, _msg); +// let balanceAfter = await bts_coreV2.getBalanceOf( +// holder.address, +// _name +// ); +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferEnd", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, holder.address); +// assert.equal(event._sn, 2); +// assert.equal(event._code, 1); +// assert.equal(event._response, ""); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// amount +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() + +// amount - +// chargedFee +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._refundableBalance).toNumber(), +// 0 +// ); +// }); +// }); +// +// describe("As a user, I want to receive PRA from ICON blockchain - After Upgrading Contract", () => { +// let bmc, +// bts_peripheryV1, +// bts_peripheryV2, +// bts_coreV1, +// bts_coreV2, +// notpayable, +// refundable; +// let service = "Coin/WrappedCoin"; +// let _bmcICON = "btp://1234.iconee/0x1234567812345678"; +// let _net = "1234.iconee"; +// let _to = "btp://1234.iconee/0x12345678"; +// let _native = "PARA"; +// let _fee = 10; +// let _fixed_fee = 500000; +// let RC_ERR = 1; +// let RC_OK = 0; +// let _uri = "https://github.com/icon-project/icon-bridge"; +// +// before(async () => { +// bmc = await BMC.new("1234.pra"); +// bts_coreV1 = await deployProxy(BTSCoreTestV1, [ +// _native, +// _fee, +// _fixed_fee, +// ]); +// bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ +// bmc.address, +// bts_coreV1.address, +// service, +// ]); +// encode_msg = await EncodeMsg.new(); +// await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); +// await bmc.addService(service, bts_peripheryV1.address); +// bts_peripheryV2 = await upgradeProxy( +// bts_peripheryV1.address, +// BTSPeripheryV2 +// ); +// bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); +// notpayable = await NotPayable.new(); +// refundable = await Refundable.new(); +// await bmc.addVerifier(_net, accounts[1]); +// await bmc.addLink(_bmcICON); +// await bts_coreV2.transferNativeCoin(_to, { +// from: accounts[0], +// value: 100000000, +// }); +// btpAddr = await bmc.bmcAddress(); +// }); +// +// it("Scenario 1: Receiving address is invalid", async () => { +// let _from = "0x12345678"; +// let _value = 1000; +// let _address = "0x1234567890123456789"; +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "InvalidAddress" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithStringAddress( +// _from, +// _address, +// _native, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// assert( +// output.logs[0].args._next === _bmcICON && +// output.logs[0].args._msg === _eventMsg +// ); +// }); +// +// it("Scenario 2: BTSCore has insufficient funds to transfer", async () => { +// let _from = "0x12345678"; +// let _value = 1000000000; +// let balanceBefore = await bmc.getBalance(accounts[1]); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "TransferFailed" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// accounts[1], +// _native, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balanceAfter = await bmc.getBalance(accounts[1]); +// +// assert.equal( +// web3.utils.BN(balanceAfter).toString(), +// web3.utils.BN(balanceBefore).toString() +// ); +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it(`Scenario 3: BTSCore tries to transfer PARA coins to a non-payable contract, but it fails`, async () => { +// let _from = "0x12345678"; +// let _value = 1000; +// let balanceBefore = await bmc.getBalance(notpayable.address); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "TransferFailed" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// notpayable.address, +// _native, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balanceAfter = await bmc.getBalance(notpayable.address); +// +// assert.equal( +// web3.utils.BN(balanceAfter).toNumber(), +// web3.utils.BN(balanceBefore).toNumber() +// ); +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 4: BTSPeriphery receives a request of transferring coins", async () => { +// let _from = "0x12345678"; +// let _value = 12345; +// let balanceBefore = await bmc.getBalance(accounts[1]); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_OK, +// "" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// accounts[1], +// _native, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balanceAfter = await bmc.getBalance(accounts[1]); +// +// assert.equal( +// web3.utils.BN(balanceAfter).toString(), +// web3.utils +// .BN(balanceBefore) +// .add(new web3.utils.BN(_value)) +// .toString() +// ); +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it(`Scenario 5: BTSPeriphery receives a request of transferring coins`, async () => { +// let _from = "0x12345678"; +// let _value = 23456; +// let balanceBefore = await bmc.getBalance(refundable.address); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_OK, +// "" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithStringAddress( +// _from, +// refundable.address, +// _native, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balanceAfter = await bmc.getBalance(refundable.address); +// +// assert.equal( +// web3.utils.BN(balanceAfter).toNumber(), +// web3.utils.BN(balanceBefore).toNumber() + _value +// ); +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// }); +// +// describe.skip("As a user, I want to receive ERC1155_ICX from ICON blockchain - After Upgrading Contract", () => { +// let bmc, +// bts_peripheryV1, +// bts_peripheryV2, +// bts_coreV1, +// bts_coreV2, +// holder, +// notpayable; +// let service = "Coin/WrappedCoin"; +// let _uri = "https://github.com/icon-project/icon-bridge"; +// let _native = "PARA"; +// let _fee = 10; +// let _fixed_fee = 500000; +// let _name = "ICON"; +// let _bmcICON = "btp://1234.iconee/0x1234567812345678"; +// let _net = "1234.iconee"; +// let _from = "0x12345678"; +// let RC_ERR = 1; +// let RC_OK = 0; +// +// before(async () => { +// bmc = await BMC.new("1234.pra"); +// bts_coreV1 = await deployProxy(BTSCoreTestV1, [ +// _native, +// _fee, +// _fixed_fee, +// ]); +// bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ +// bmc.address, +// bts_coreV1.address, +// service, +// ]); +// encode_msg = await EncodeMsg.new(); +// await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); +// await bmc.addService(service, bts_peripheryV1.address); +// bts_peripheryV2 = await upgradeProxy( +// bts_peripheryV1.address, +// BTSPeripheryV2 +// ); +// bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); +// holder = await Holder.new(); +// notpayable = await NotPayable.new(); +// await bmc.addVerifier(_net, accounts[1]); +// await bmc.addLink(_bmcICON); +// await holder.addBSHContract( +// bts_peripheryV2.address, +// bts_coreV2.address +// ); +// await bts_coreV2.register(_name, "", 18); +// coinId = await bts_coreV2.coinId(_name); +// btpAddr = await bmc.bmcAddress(); +// }); +// +// it("Scenario 1: Receiving address is invalid", async () => { +// let _value = 1000; +// let _address = "0x1234567890123456789"; +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "InvalidAddress" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithStringAddress( +// _from, +// _address, +// _name, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it(`Scenario 2: Receiving contract does not implement ERC1155Holder / Receiver`, async () => { +// let _value = 1000; +// let balanceBefore = ( +// await bts_coreV2.getBalanceOf(notpayable.address, _name) +// )[0]; +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "TransferFailed" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// notpayable.address, +// _name, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balanceAfter = ( +// await bts_coreV2.getBalanceOf(notpayable.address, _name) +// )[0]; +// +// assert.equal( +// web3.utils.BN(balanceAfter).toNumber(), +// web3.utils.BN(balanceBefore).toNumber() +// ); +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 3: BTSPeriphery receives a request of invalid token", async () => { +// let _value = 3000; +// let _tokenName = "Ethereum"; +// let invalid_coin_id = await bts_coreV2.coinId(_tokenName); +// let balanceBefore = ( +// await bts_coreV2.getBalanceOf(notpayable.address, _tokenName) +// )[0]; +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "UnregisteredCoin" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// holder.address, +// _tokenName, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balanceAfter = ( +// await bts_coreV2.getBalanceOf(notpayable.address, _tokenName) +// )[0]; +// +// assert.equal( +// web3.utils.BN(balanceAfter).toNumber(), +// web3.utils.BN(balanceBefore).toNumber() +// ); +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 4: Receiver is a ERC1155Holder contract", async () => { +// let _value = 2500; +// let balanceBefore = ( +// await bts_coreV2.getBalanceOf(notpayable.address, _name) +// )[0]; +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_OK, +// "" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// holder.address, +// _name, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balanceAfter = ( +// await bts_coreV2.getBalanceOf(notpayable.address, _name) +// )[0]; +// +// assert.equal( +// web3.utils.BN(balanceAfter).toNumber(), +// web3.utils.BN(balanceBefore).toNumber() + _value +// ); +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 5: Receiver is an account client", async () => { +// let _value = 5500; +// let balanceBefore = ( +// await bts_coreV2.getBalanceOf(notpayable.address, _name) +// )[0]; +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_OK, +// "" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// accounts[1], +// _name, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balanceAfter = ( +// await bts_coreV2.getBalanceOf(notpayable.address, _name) +// )[0]; +// +// assert.equal( +// web3.utils.BN(balanceAfter).toNumber(), +// web3.utils.BN(balanceBefore).toNumber() + _value +// ); +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// }); +// +// describe("BSHs Handle Fee Aggregation - After Upgrading Contract", () => { +// let bts_peripheryV1, +// bts_peripheryV2, +// bts_coreV1, +// bts_coreV2, +// bmc, +// holder; +// let service = "Coin/WrappedCoin"; +// let _uri = "https://github.com/icon-project/icon-bridge"; +// let _native = "PARA"; +// let _fee = 10; +// let _fixed_fee = 500000; +// let _name1 = "ICON"; +// let _name2 = "BINANCE"; +// let _name3 = "ETHEREUM"; +// let _name4 = "TRON"; +// let _net1 = "1234.iconee"; +// let _net2 = "1234.binance"; +// let _from1 = "0x12345678"; +// let _from2 = "0x12345678"; +// let _value1 = 999999999999999; +// let _value2 = 999999999999999; +// let _to1 = "btp://1234.iconee/0x12345678"; +// let _to2 = "btp://1234.binance/0x12345678"; +// let _txAmt = 1000000; +// let _txAmt1 = 100000000; +// let _txAmt2 = 5000000; +// let RC_OK = 0; +// let RC_ERR = 1; +// let REPONSE_HANDLE_SERVICE = 2; +// let _bmcICON = "btp://1234.iconee/0x1234567812345678"; +// let _sn0 = 1; +// let _sn1 = 2; +// let _sn2 = 3; +// +// before(async () => { +// bmc = await BMC.new("1234.pra"); +// bts_coreV1 = await deployProxy(BTSCoreTestV1, [ +// _native, +// _fee, +// _fixed_fee, +// ]); +// bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ +// bmc.address, +// bts_coreV1.address, +// service, +// ]); +// encode_msg = await EncodeMsg.new(); +// await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); +// await bmc.addService(service, bts_peripheryV1.address); +// bts_peripheryV2 = await upgradeProxy( +// bts_peripheryV1.address, +// BTSPeripheryV2 +// ); +// bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); +// holder = await Holder.new(); +// btpAddr = await bmc.bmcAddress(); +// await bmc.addVerifier(_net1, accounts[1]); +// await bmc.addVerifier(_net2, accounts[2]); +// await bmc.addLink(_bmcICON); +// await holder.addBSHContract( +// bts_peripheryV2.address, +// bts_coreV2.address +// ); +// await bts_coreV2.register(_name1, "", 18); +// await bts_coreV2.register(_name2, "", 18); +// await bts_coreV2.register(_name3, "", 18); +// await bts_coreV2.register(_name4, "", 18); +// let _msg1 = await encode_msg.encodeTransferMsgWithAddress( +// _from1, +// holder.address, +// _name1, +// _value1 +// ); +// await bmc.receiveRequest(_bmcICON, "", service, _sn0, _msg1); +// let _msg2 = await encode_msg.encodeTransferMsgWithAddress( +// _from2, +// holder.address, +// _name2, +// _value2 +// ); +// await bmc.receiveRequest(_bmcICON, "", service, _sn1, _msg2); +// await bts_coreV2.transferNativeCoin(_to1, { +// from: accounts[0], +// value: _txAmt, +// }); +// let _responseMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_OK, +// "" +// ); +// await bmc.receiveResponse(_net1, service, _sn0, _responseMsg); +// coinId1 = await bts_coreV2.coinId(_name1); +// coinId2 = await bts_coreV2.coinId(_name2); +// coinId3 = await bts_coreV2.coinId(_name3); +// coinId4 = await bts_coreV2.coinId(_name4); +// await holder.setApprove(coinId1, bts_coreV2.address, _txAmt1); +// await holder.setApprove(coinId2, bts_coreV2.address, _txAmt2); +// await holder.setApprove(coinId3, bts_coreV2.address, _txAmt2); +// await holder.setApprove(coinId4, bts_coreV2.address, _txAmt2); +// await holder.callTransfer(_name1, _txAmt1, _to1); +// await bmc.receiveResponse(_net1, service, _sn1, _responseMsg); +// await holder.callTransfer(_name2, _txAmt2, _to2); +// await bmc.receiveResponse(_net1, service, _sn2, _responseMsg); +// }); +// +// it(`Scenario 1: Query 'Aggregation Fee'`, async () => { +// let aggregationFee = await bts_coreV2.getAccumulatedFees(); +// +// assert.equal(aggregationFee.length, 5); +// assert.equal(aggregationFee[0].coinName, "PARA"); +// assert.equal(aggregationFee[1].coinName, "ICON"); +// assert.equal(aggregationFee[2].coinName, "BINANCE"); +// assert.equal(aggregationFee[3].coinName, "ETHEREUM"); +// assert.equal(aggregationFee[4].coinName, "TRON"); +// +// assert.equal( +// Number(aggregationFee[0].value), +// Math.floor(_txAmt / 1000) + _fixed_fee +// ); +// assert.equal( +// Number(aggregationFee[1].value), +// Math.floor(_txAmt1 / 1000) + _fixed_fee +// ); +// assert.equal( +// Number(aggregationFee[2].value), +// Math.floor(_txAmt2 / 1000) + _fixed_fee +// ); +// assert.equal(Number(aggregationFee[3].value), 0); +// assert.equal(Number(aggregationFee[4].value), 0); +// }); +// +// it("Scenario 2: Receiving a FeeGathering request not from BMCService", async () => { +// let _sn3 = 3; +// let FA1Before = await bts_peripheryV2.getAggregationFeeOf(_native); // state Aggregation Fee of each type of Coins +// let FA2Before = await bts_peripheryV2.getAggregationFeeOf(_name1); +// let FA3Before = await bts_peripheryV2.getAggregationFeeOf(_name2); +// await truffleAssert.reverts( +// bts_peripheryV2.handleFeeGathering.call(_to1, service, { +// from: accounts[1], +// }), +// "Unauthorized" +// ); +// let FA1After = await bts_peripheryV2.getAggregationFeeOf(_native); +// let FA2After = await bts_peripheryV2.getAggregationFeeOf(_name1); +// let FA3After = await bts_peripheryV2.getAggregationFeeOf(_name2); +// let fees = await bts_peripheryV2.getPendingRequest(_sn3); // get pending Aggregation Fee list +// +// assert.equal( +// web3.utils.BN(FA1Before).toNumber(), +// web3.utils.BN(FA1After).toNumber() +// ); +// assert.equal( +// web3.utils.BN(FA2Before).toNumber(), +// web3.utils.BN(FA2After).toNumber() +// ); +// assert.equal( +// web3.utils.BN(FA3Before).toNumber(), +// web3.utils.BN(FA3After).toNumber() +// ); +// assert.equal(fees.amounts.length, 0); +// }); +// +// // Before: +// // + state Aggregation Fee of each type of Coins are set +// // + pendingAggregation Fee list is empty +// // After: +// // + all states of Aggregation Fee are push into pendingAggregation Fee list +// // + state Aggregation Fee of each type of Coins are reset +// it("Scenario 3: Handle GatherFee request from BMCService contract", async () => { +// let _sn3 = 4; +// let FA1Before = await bts_peripheryV2.getAggregationFeeOf(_native); // state Aggregation Fee of each type of Coins +// let FA2Before = await bts_peripheryV2.getAggregationFeeOf(_name1); +// let FA3Before = await bts_peripheryV2.getAggregationFeeOf(_name2); +// let _bmcService = await encode_msg.encodeBMCService(_to1, [ +// service, +// ]); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// "bmc", +// 100, +// _bmcService +// ); +// let FA1After = await bts_peripheryV2.getAggregationFeeOf(_native); +// let FA2After = await bts_peripheryV2.getAggregationFeeOf(_name1); +// let FA3After = await bts_peripheryV2.getAggregationFeeOf(_name2); +// let fees = await bts_peripheryV2.getPendingRequest(_sn3); // get pending Aggregation Fee list +// let list = []; +// for (let i = 0; i < fees.amounts.length; i++) { +// list[i] = [fees.coinNames[i], fees.amounts[i]]; +// } +// let _eventMsg = await encode_msg.encodeTransferFeesBMCMessage( +// btpAddr, +// _bmcICON, +// _to1, +// service, +// _sn3, +// bts_coreV2.address, +// list +// ); +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferStart", +// { fromBlock: output.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, bts_coreV2.address); +// assert.equal(event._to, _to1); +// assert.equal(event._sn, _sn3); +// assert.equal(event._assetDetails.length, 3); +// assert.equal(event._assetDetails[0].coinName, _native); +// assert.equal(event._assetDetails[0].value, fees.amounts[0]); +// assert.equal(event._assetDetails[0].fee, 0); +// assert.equal(event._assetDetails[1].coinName, _name1); +// assert.equal(event._assetDetails[1].value, fees.amounts[1]); +// assert.equal(event._assetDetails[1].fee, 0); +// assert.equal(event._assetDetails[2].coinName, _name2); +// assert.equal(event._assetDetails[2].value, fees.amounts[2]); +// assert.equal(event._assetDetails[2].fee, 0); +// +// assert.equal( +// web3.utils.BN(FA1Before).toNumber(), +// Math.floor(_txAmt / 1000) + _fixed_fee +// ); +// assert.equal( +// web3.utils.BN(FA2Before).toNumber(), +// Math.floor(_txAmt1 / 1000) + _fixed_fee +// ); +// assert.equal( +// web3.utils.BN(FA3Before).toNumber(), +// Math.floor(_txAmt2 / 1000) + _fixed_fee +// ); +// +// assert.equal(web3.utils.BN(FA1After).toNumber(), 0); +// assert.equal(web3.utils.BN(FA2After).toNumber(), 0); +// assert.equal(web3.utils.BN(FA3After).toNumber(), 0); +// +// assert.equal(fees.coinNames[0], _native); +// assert.equal(fees.coinNames[1], _name1); +// assert.equal(fees.coinNames[2], _name2); +// +// assert.equal( +// Number(fees.amounts[0]), +// Math.floor(_txAmt / 1000) + _fixed_fee +// ); +// assert.equal( +// Number(fees.amounts[1]), +// Math.floor(_txAmt1 / 1000) + _fixed_fee +// ); +// assert.equal( +// Number(fees.amounts[2]), +// Math.floor(_txAmt2 / 1000) + _fixed_fee +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 4: Receiving a successful response", async () => { +// let _sn3 = 4; +// let feesBefore = await bts_peripheryV2.getPendingRequest(_sn3); +// let _responseMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_OK, +// "" +// ); +// let tx = await bmc.receiveResponse( +// _net1, +// service, +// _sn3, +// _responseMsg +// ); +// let feesAfter = await bts_peripheryV2.getPendingRequest(_sn3); +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferEnd", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, bts_coreV2.address); +// assert.equal(event._sn, _sn3); +// assert.equal(event._code, 0); +// assert.equal(event._response, ""); +// +// assert.equal(feesBefore.amounts.length, 3); +// assert.equal(feesBefore.coinNames[0], _native); +// assert.equal(feesBefore.coinNames[1], _name1); +// assert.equal(feesBefore.coinNames[2], _name2); +// assert.equal( +// Number(feesBefore.amounts[0]), +// Math.floor(_txAmt / 1000) + _fixed_fee +// ); +// assert.equal( +// Number(feesBefore.amounts[1]), +// Math.floor(_txAmt1 / 1000) + _fixed_fee +// ); +// assert.equal( +// Number(feesBefore.amounts[2]), +// Math.floor(_txAmt2 / 1000) + _fixed_fee +// ); +// assert.equal(feesAfter.amounts.length, 0); +// }); +// +// it("Scenario 5: Receiving an error response", async () => { +// let _sn4 = 5; +// let _sn5 = 6; +// let _sn6 = 7; +// let _amt1 = 2000000; +// let _amt2 = 6000000; +// await holder.setApprove(coinId1, bts_coreV2.address, _amt1); +// await holder.setApprove(coinId2, bts_coreV2.address, _amt2); +// await holder.callTransfer(_name1, _amt1, _to1); +// let _responseMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_OK, +// "" +// ); +// await bmc.receiveResponse(_net1, service, _sn4, _responseMsg); +// await holder.callTransfer(_name2, _amt2, _to2); +// await bmc.receiveResponse(_net2, service, _sn5, _responseMsg); +// let _bmcService = await encode_msg.encodeBMCService(_to1, [ +// service, +// ]); +// await bmc.receiveRequest(_bmcICON, "", "bmc", 100, _bmcService); +// +// let FA1Before = await bts_peripheryV2.getAggregationFeeOf(_name1); +// let FA2Before = await bts_peripheryV2.getAggregationFeeOf(_name2); +// let feesBefore = await bts_peripheryV2.getPendingRequest(_sn6); +// let _errMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_ERR, +// "" +// ); +// let tx = await bmc.receiveResponse(_net1, service, _sn6, _errMsg); +// let FA1After = await bts_peripheryV2.getAggregationFeeOf(_name1); +// let FA2After = await bts_peripheryV2.getAggregationFeeOf(_name2); +// let feesAfter = await bts_peripheryV2.getPendingRequest(_sn6); +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferEnd", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, bts_coreV2.address); +// assert.equal(event._sn, _sn6); +// assert.equal(event._code, 1); +// assert.equal(event._response, ""); +// +// assert.equal(feesBefore.amounts.length, 2); +// assert.equal(feesBefore.coinNames[0], _name1); +// assert.equal(feesBefore.coinNames[1], _name2); +// assert.equal( +// Number(feesBefore.amounts[0]), +// Math.floor(_amt1 / 1000) + _fixed_fee +// ); +// assert.equal( +// Number(feesBefore.amounts[1]), +// Math.floor(_amt2 / 1000) + _fixed_fee +// ); +// +// assert.equal(web3.utils.BN(FA1Before).toNumber(), 0); +// assert.equal(web3.utils.BN(FA2Before).toNumber(), 0); +// assert.equal(feesAfter.amounts.length, 0); +// assert.equal( +// web3.utils.BN(FA1After).toNumber(), +// Math.floor(_amt1 / 1000) + _fixed_fee +// ); +// assert.equal( +// web3.utils.BN(FA2After).toNumber(), +// Math.floor(_amt2 / 1000) + _fixed_fee +// ); +// }); +// }); +// +// describe("As a user, I want to receive multiple Coins/Tokens from ICON blockchain - After Upgrading Contract", () => { +// let bts_peripheryV1, +// bts_peripheryV2, +// bts_coreV1, +// bts_coreV2, +// bmc, +// holder, +// refundable; +// let service = "Coin/WrappedCoin"; +// let _uri = "https://github.com/icon-project/icon-bridge"; +// let _native = "PARA"; +// let _fee = 10; +// let _fixed_fee = 500000; +// let _name1 = "ICON"; +// let _name2 = "BINANCE"; +// let _name3 = "ETHEREUM"; +// let _name4 = "TRON"; +// let _net1 = "1234.iconee"; +// let _bmcICON = "btp://1234.iconee/0x1234567812345678"; +// let RC_OK = 0; +// let RC_ERR = 1; +// let _from1 = "0x12345678"; +// let _to = "btp://1234.iconee/0x12345678"; +// +// before(async () => { +// bmc = await BMC.new("1234.pra"); +// bts_coreV1 = await deployProxy(BTSCoreTestV1, [ +// _native, +// _fee, +// _fixed_fee, +// ]); +// bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ +// bmc.address, +// bts_coreV1.address, +// service, +// ]); +// encode_msg = await EncodeMsg.new(); +// await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); +// await bmc.addService(service, bts_peripheryV1.address); +// bts_peripheryV2 = await upgradeProxy( +// bts_peripheryV1.address, +// BTSPeripheryV2 +// ); +// bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); +// holder = await Holder.new(); +// refundable = await Refundable.new(); +// btpAddr = await bmc.bmcAddress(); +// await bmc.addVerifier(_net1, accounts[1]); +// await bmc.addLink(_bmcICON); +// await holder.addBSHContract( +// bts_peripheryV2.address, +// bts_coreV2.address +// ); +// await bts_coreV2.register(_name1, "", 18); +// await bts_coreV2.register(_name2, "", 18); +// await bts_coreV2.register(_name3, "", 18); +// await bts_coreV2.register(_name4, "", 18); +// await bts_coreV2.transferNativeCoin(_to, { +// from: accounts[0], +// value: 10000000, +// }); +// }); +// +// it("Scenario 1: Receiving address is invalid", async () => { +// let _value1 = 1000; +// let _value2 = 10000; +// let _value3 = 40000; +// let _address = "0x1234567890123456789"; +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "InvalidAddress" +// ); +// let _msg = await encode_msg.encodeBatchTransferMsgWithStringAddress( +// _from1, +// _address, +// [ +// [_native, _value1], +// [_name1, _value2], +// [_name2, _value3], +// ] +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 2: BSHPerphery receives a request of invalid token", async () => { +// let _value1 = 1000; +// let _value2 = 10000; +// let _value3 = 40000; +// let _invalid_token = "EOS"; +// let balance1Before = await bts_coreV2.getBalanceOf( +// holder.address, +// _name1 +// ); +// let balance2Before = await bts_coreV2.getBalanceOf( +// holder.address, +// _name2 +// ); +// let balance3Before = await bts_coreV2.getBalanceOf( +// holder.address, +// _invalid_token +// ); +// +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "UnregisteredCoin" +// ); +// let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( +// _from1, +// holder.address, +// [ +// [_name1, _value1], +// [_name2, _value2], +// [_invalid_token, _value3], +// ] +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balance1After = await bts_coreV2.getBalanceOf( +// holder.address, +// _name1 +// ); +// let balance2After = await bts_coreV2.getBalanceOf( +// holder.address, +// _name2 +// ); +// let balance3After = await bts_coreV2.getBalanceOf( +// holder.address, +// _invalid_token +// ); +// +// assert.equal( +// web3.utils.BN(balance1Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance3Before._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balance1After._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2After._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance3After._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 3: One of requests is failed in TransferBatch", async () => { +// let _value1 = 1000; +// let _value2 = 10000; +// let _value3 = 20000000; +// let balance1Before = await bts_coreV2.getBalanceOf( +// accounts[1], +// _name1 +// ); +// let balance2Before = await bts_coreV2.getBalanceOf( +// accounts[1], +// _name2 +// ); +// let balance3Before = await bts_coreV2.getBalanceOf( +// accounts[1], +// _native +// ); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "TransferFailed" +// ); +// let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( +// _from1, +// accounts[1], +// [ +// [_name1, _value1], +// [_name2, _value2], +// [_native, _value3], +// ] +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balance1After = await bts_coreV2.getBalanceOf( +// accounts[1], +// _name1 +// ); +// let balance2After = await bts_coreV2.getBalanceOf( +// accounts[1], +// _name2 +// ); +// let balance3After = await bts_coreV2.getBalanceOf( +// accounts[1], +// _native +// ); +// +// assert.equal( +// web3.utils.BN(balance1Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2Before._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balance1After._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2After._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 4: One of requests is failed in TransferBatch", async () => { +// let _value1 = 1000; +// let _value2 = 10000; +// let _value3 = 40000; +// let balance1Before = await bts_coreV2.getBalanceOf( +// refundable.address, +// _native +// ); +// let balance2Before = await bts_coreV2.getBalanceOf( +// refundable.address, +// _name1 +// ); +// let balance3Before = await bts_coreV2.getBalanceOf( +// refundable.address, +// _name2 +// ); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "TransferFailed" +// ); +// let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( +// _from1, +// refundable.address, +// [ +// [_native, _value1], +// [_name1, _value2], +// [_name2, _value3], +// ] +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balance1After = await bts_coreV2.getBalanceOf( +// refundable.address, +// _native +// ); +// let balance2After = await bts_coreV2.getBalanceOf( +// refundable.address, +// _name1 +// ); +// let balance3After = await bts_coreV2.getBalanceOf( +// refundable.address, +// _name2 +// ); +// +// assert.equal( +// web3.utils.BN(balance1Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance3Before._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balance1After._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2After._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance3After._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 5: One of requests is failed in TransferBatch", async () => { +// let _value1 = 1000; +// let _value2 = 10000; +// let _value3 = 40000; +// let balance1Before = await bts_coreV2.getBalanceOf( +// holder.address, +// _name1 +// ); +// let balance2Before = await bts_coreV2.getBalanceOf( +// holder.address, +// _name2 +// ); +// let balance3Before = await bts_coreV2.getBalanceOf( +// holder.address, +// _native +// ); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "TransferFailed" +// ); +// let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( +// _from1, +// holder.address, +// [ +// [_name1, _value1], +// [_name2, _value2], +// [_native, _value3], +// ] +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balance1After = await bts_coreV2.getBalanceOf( +// holder.address, +// _name1 +// ); +// let balance2After = await bts_coreV2.getBalanceOf( +// holder.address, +// _name2 +// ); +// let balance3After = await bts_coreV2.getBalanceOf( +// holder.address, +// _native +// ); +// +// assert.equal( +// web3.utils.BN(balance1Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance3Before._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balance1After._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2After._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance3After._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 6: Receiving a successful TransferBatch request", async () => { +// let _value1 = 1000; +// let _value2 = 10000; +// let _value3 = 40000; +// let balance1Before = await bts_coreV2.getBalanceOf( +// holder.address, +// _name1 +// ); +// let balance2Before = await bts_coreV2.getBalanceOf( +// holder.address, +// _name2 +// ); +// let balance3Before = await bts_coreV2.getBalanceOf( +// holder.address, +// _name3 +// ); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_OK, +// "" +// ); +// let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( +// _from1, +// holder.address, +// [ +// [_name1, _value1], +// [_name2, _value2], +// [_name3, _value3], +// ] +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balance1After = await bts_coreV2.getBalanceOf( +// holder.address, +// _name1 +// ); +// let balance2After = await bts_coreV2.getBalanceOf( +// holder.address, +// _name2 +// ); +// let balance3After = await bts_coreV2.getBalanceOf( +// holder.address, +// _name3 +// ); +// +// assert.equal( +// web3.utils.BN(balance1Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance3Before._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balance1After._usableBalance).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balance2After._usableBalance).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balance3After._usableBalance).toNumber(), +// _value3 +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 7: Receiving a successful TransferBatch request", async () => { +// let _value1 = 1000; +// let _value2 = 10000; +// let _value3 = 40000; +// let balance1Before = await bts_coreV2.getBalanceOf( +// accounts[1], +// _native +// ); +// let balance2Before = await bts_coreV2.getBalanceOf( +// accounts[1], +// _name2 +// ); +// let balance3Before = await bts_coreV2.getBalanceOf( +// accounts[1], +// _name3 +// ); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_OK, +// "" +// ); +// let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( +// _from1, +// accounts[1], +// [ +// [_native, _value1], +// [_name2, _value2], +// [_name3, _value3], +// ] +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balance1After = await bts_coreV2.getBalanceOf( +// accounts[1], +// _native +// ); +// let balance2After = await bts_coreV2.getBalanceOf( +// accounts[1], +// _name2 +// ); +// let balance3After = await bts_coreV2.getBalanceOf( +// accounts[1], +// _name3 +// ); +// +// assert.equal( +// web3.utils.BN(balance1After._usableBalance).toString(), +// web3.utils +// .BN(balance1Before._usableBalance) +// .add(new web3.utils.BN(_value1)) +// .toString() +// ); +// assert.equal( +// web3.utils.BN(balance2After._usableBalance).toNumber(), +// web3.utils.BN(balance2Before._usableBalance).toNumber() + +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balance3After._usableBalance).toNumber(), +// web3.utils.BN(balance3Before._usableBalance).toNumber() + +// _value3 +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// }); +// +// describe("As a user, I want to send multiple coins/tokens to ICON blockchain - After Upgrading Contract", () => { +// let bts_peripheryV1, +// bts_peripheryV2, +// bts_coreV1, +// bts_coreV2, +// bmc, +// holder; +// let service = "Coin/WrappedCoin"; +// let _uri = "https://github.com/icon-project/icon-bridge"; +// let _native = "PARA"; +// let _fee = 10; +// let _fixed_fee = 500000; +// let _net = "1234.iconee"; +// let _from = "0x12345678"; +// let _value = 999999999999999; +// let REPONSE_HANDLE_SERVICE = 2; +// let RC_OK = 0; +// let RC_ERR = 1; +// let _bmcICON = "btp://1234.iconee/0x1234567812345678"; +// let _coin1 = "ICON"; +// let _coin2 = "TRON"; +// let _coin3 = "BINANCE"; +// let initAmt = 1000000000000000; +// +// before(async () => { +// bmc = await BMC.new("1234.pra"); +// bts_coreV1 = await deployProxy(BTSCoreTestV1, [ +// _native, +// _fee, +// _fixed_fee, +// ]); +// bts_peripheryV1 = await deployProxy(BTSPeripheryV1, [ +// bmc.address, +// bts_coreV1.address, +// service, +// ]); +// encode_msg = await EncodeMsg.new(); +// await bts_coreV1.updateBTSPeriphery(bts_peripheryV1.address); +// await bmc.addService(service, bts_peripheryV1.address); +// bts_peripheryV2 = await upgradeProxy( +// bts_peripheryV1.address, +// BTSPeripheryV2 +// ); +// bts_coreV2 = await upgradeProxy(bts_coreV1.address, BTSCoreTestV2); +// holder = await Holder.new(); +// await bmc.addVerifier(_net, accounts[1]); +// await bmc.addLink(_bmcICON); +// await holder.addBSHContract( +// bts_peripheryV2.address, +// bts_coreV2.address +// ); +// await bts_coreV2.register(_coin1, "", 18); +// await bts_coreV2.register(_coin2, "", 18); +// await bts_coreV2.register(_coin3, "", 18); +// await bts_coreV2.transferNativeCoin( +// "btp://1234.iconee/0x12345678", +// { from: accounts[0], value: initAmt } +// ); +// await holder.deposit({ from: accounts[1], value: 100000000000000 }); +// let _msg1 = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// holder.address, +// _coin1, +// _value +// ); +// await bmc.receiveRequest(_bmcICON, "", service, 0, _msg1); +// let _msg2 = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// holder.address, +// _coin2, +// _value +// ); +// await bmc.receiveRequest(_bmcICON, "", service, 1, _msg2); +// let _msg3 = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// holder.address, +// _coin3, +// _value +// ); +// await bmc.receiveRequest(_bmcICON, "", service, 2, _msg3); +// +// _msg1 = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// accounts[1], +// _coin1, +// _value +// ); +// await bmc.receiveRequest(_bmcICON, "", service, 0, _msg1); +// _msg2 = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// accounts[1], +// _coin2, +// _value +// ); +// await bmc.receiveRequest(_bmcICON, "", service, 1, _msg2); +// _msg3 = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// accounts[1], +// _coin3, +// _value +// ); +// await bmc.receiveRequest(_bmcICON, "", service, 2, _msg3); +// }); +// +// it("Scenario 1: User has not yet set approval for token being transferred out by Operator", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _values = [600000, 700000]; +// let _native_amt = 800000; +// let _query = [_native, _coin1, _coin2]; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_coreV2.address, +// _coins, +// _values, +// _to, +// _native_amt +// ), +// "revert" +// ); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _query +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it(`Scenario 2: User has set approval, but user's balance has insufficient amount`, async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _values = [600000, 9999999999999999n]; +// let _native_amt = 700000; +// let _query = [_native, _coin1, _coin2]; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// coinId1 = await bts_coreV2.coinId(_coin1); +// coinId2 = await bts_coreV2.coinId(_coin2); +// await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); +// await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_coreV2.address, +// _coins, +// _values, +// _to, +// _native_amt +// ), +// "revert" +// ); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _query +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 3: User requests to transfer an invalid Token", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let invalid_token = "EOS"; +// let _coins = [_coin1, invalid_token]; +// let _values = [600000, 700000]; +// let _native_amt = 800000; +// let _query = [_native, _coin1, invalid_token]; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// coinId1 = await bts_coreV2.coinId(_coins[0]); +// coinId2 = await bts_coreV2.coinId(_coins[1]); +// await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); +// // await holder.setApprove(coinId2, bts_coreV2.address,_values[1]); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_coreV2.address, +// _coins, +// _values, +// _to, +// _native_amt +// ), +// "revert" +// ); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _query +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 4: User transfers Tokens to an invalid BTP Address format", async () => { +// let _to = "1234.iconee/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _values = [600000, 700000]; +// let _query = [_native, _coin1, _coin2]; +// let _native_amt = 800000; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// coinId1 = await bts_coreV2.coinId(_coins[0]); +// coinId2 = await bts_coreV2.coinId(_coins[1]); +// await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); +// await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_coreV2.address, +// _coins, +// _values, +// _to, +// _native_amt +// ), +// "revert" +// ); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _query +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 5: User requests to transfer zero Token", async () => { +// let _to = "1234.iconee/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _values = [600000, 0]; +// let _query = [_native, _coin1, _coin2]; +// let _native_amt = 800000; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// coinId1 = await bts_coreV2.coinId(_coin1); +// coinId2 = await bts_coreV2.coinId(_coin2); +// await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); +// await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_coreV2.address, +// _coins, +// _values, +// _to, +// _native_amt +// ), +// "revert" +// ); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _query +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 6: Transffering amount is less than fixed fee", async () => { +// let _to = "1234.iconee/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _values = [600000, 300000]; +// let _query = [_native, _coin1, _coin2]; +// let _native_amt = 800000; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// coinId1 = await bts_coreV2.coinId(_coin1); +// coinId2 = await bts_coreV2.coinId(_coin2); +// await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); +// await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_coreV2.address, +// _coins, +// _values, +// _to, +// _native_amt +// ), +// "revert" +// ); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _query +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 7: User requests to transfer to an invalid network/Not Supported Network", async () => { +// let _to = "btp://1234.eos/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _values = [600000, 700000]; +// let _query = [_native, _coin1, _coin2]; +// let _native_amt = 800000; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// coinId1 = await bts_coreV2.coinId(_coin1); +// coinId2 = await bts_coreV2.coinId(_coin2); +// await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); +// await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_coreV2.address, +// _coins, +// _values, +// _to, +// _native_amt +// ), +// "revert" +// ); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _query +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 8: Account client sends an invalid request of transferBatch", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _coins = [_native, _native, _native]; +// let _values = [600000, 600000, 600000]; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// accounts[2], +// _coins +// ); +// await truffleAssert.reverts( +// bts_coreV2.transferBatch.call(_coins, _values, _to, { +// from: accounts[2], +// value: 600000, +// }), +// "revert" +// ); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// accounts[2], +// _coins +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _coins +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// initAmt +// ); +// }); +// +// it("Scenario 9: Contract client sends an invalid request of transferBatch", async () => { +// let _to = "btp://1234.eos/0x12345678"; +// let _coins = [_native, _coin1, _coin2]; +// let _values = [600000, 700000]; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// coinId1 = await bts_coreV2.coinId(_coin1); +// coinId2 = await bts_coreV2.coinId(_coin2); +// await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); +// await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_coreV2.address, +// _coins, +// _values, +// _to, +// 0 +// ), +// "revert" +// ); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _coins +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 10: Contract client sends a valid transferBatch request", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _values = [_value2, _value3]; +// let _query = [_native, _coin1, _coin2]; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// coinId1 = await bts_coreV2.coinId(_coin1); +// coinId2 = await bts_coreV2.coinId(_coin2); +// await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); +// await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); +// let tx = await holder.callTransferBatch( +// bts_coreV2.address, +// _coins, +// _values, +// _to, +// _value1 +// ); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _query +// ); +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferStart", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, holder.address); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 2); +// assert.equal(event._assetDetails.length, 3); +// assert.equal(event._assetDetails[0].coinName, _coin1); +// assert.equal(event._assetDetails[0].value, _value2 - chargedFee2); +// assert.equal(event._assetDetails[0].fee, chargedFee2); +// assert.equal(event._assetDetails[1].coinName, _coin2); +// assert.equal(event._assetDetails[1].value, _value3 - chargedFee3); +// assert.equal(event._assetDetails[1].fee, chargedFee3); +// assert.equal(event._assetDetails[2].coinName, _native); +// assert.equal(event._assetDetails[2].value, _value1 - chargedFee1); +// assert.equal(event._assetDetails[2].fee, chargedFee1); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 2); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// holder.address +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _coin1 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// _value2 - chargedFee2 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), +// _coin2 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), +// _value3 - chargedFee3 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), +// _native +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), +// _value1 - chargedFee1 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt + _value1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// _value3 +// ); +// }); +// +// it("Scenario 11: BTSPeriphery receives a successful response of a recent request", async () => { +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _coins = [_native, _coin1, _coin2]; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let _responseMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_OK, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 2, _responseMsg); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let fees = await bts_coreV2.getAccumulatedFees(); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _coins +// ); +// +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferEnd", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, holder.address); +// assert.equal(event._sn, 2); +// assert.equal(event._code, 0); +// assert.equal(event._response, ""); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal(fees[0].coinName, _native); +// assert.equal(Number(fees[0].value), chargedFee1); +// assert.equal(fees[1].coinName, _coin1); +// assert.equal(Number(fees[1].value), chargedFee2); +// assert.equal(fees[2].coinName, _coin2); +// assert.equal(Number(fees[2].value), chargedFee3); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt + _value1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// chargedFee3 +// ); +// }); +// +// it("Scenario 12: Account client sends a valid transferBatch request", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _coins = [_coin3, _coin1, _coin2]; +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _values = [_value1, _value2, _value3]; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// accounts[1], +// _coins +// ); +// coinId1 = await bts_coreV2.coinId(_coins[0]); +// coinId2 = await bts_coreV2.coinId(_coins[1]); +// coinId3 = await bts_coreV2.coinId(_coins[2]); +// let ERC20Tradable1 = await ERC20Tradable.at(coinId1); +// let ERC20Tradable2 = await ERC20Tradable.at(coinId2); +// let ERC20Tradable3 = await ERC20Tradable.at(coinId3); +// await ERC20Tradable1.approve(bts_coreV2.address, _values[0], { +// from: accounts[1], +// }); +// await ERC20Tradable2.approve(bts_coreV2.address, _values[1], { +// from: accounts[1], +// }); +// await ERC20Tradable3.approve(bts_coreV2.address, _values[2], { +// from: accounts[1], +// }); +// let tx = await bts_coreV2.transferBatch(_coins, _values, _to, { +// from: accounts[1], +// }); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// accounts[1], +// _coins +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _coins +// ); +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferStart", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, accounts[1]); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 3); +// assert.equal(event._assetDetails.length, 3); +// assert.equal(event._assetDetails[0].coinName, _coin3); +// assert.equal(event._assetDetails[0].value, _value1 - chargedFee1); +// assert.equal(event._assetDetails[0].fee, chargedFee1); +// assert.equal(event._assetDetails[1].coinName, _coin1); +// assert.equal(event._assetDetails[1].value, _value2 - chargedFee2); +// assert.equal(event._assetDetails[1].fee, chargedFee2); +// assert.equal(event._assetDetails[2].coinName, _coin2); +// assert.equal(event._assetDetails[2].value, _value3 - chargedFee3); +// assert.equal(event._assetDetails[2].fee, chargedFee3); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 3); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// accounts[1] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _coin3 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// _value1 - chargedFee1 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), +// _coin1 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), +// _value2 - chargedFee2 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), +// _coin2 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), +// _value3 - chargedFee3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// _value2 + chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// _value3 + chargedFee3 +// ); +// }); +// +// it("Scenario 13: BTSPeriphery receives an error response of a recent request", async () => { +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _coins = [_coin3, _coin1, _coin2]; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// accounts[1], +// _coins +// ); +// let _responseMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_ERR, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 3, _responseMsg); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// accounts[1], +// _coins +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _coins +// ); +// +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferEnd", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, accounts[1]); +// assert.equal(event._sn, 3); +// assert.equal(event._code, 1); +// assert.equal(event._response, ""); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() + +// _value1 - +// chargedFee1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() + +// _value2 - +// chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() + +// _value3 - +// chargedFee3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// chargedFee1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 2 * chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 2 * chargedFee3 +// ); +// }); +// +// it("Scenario 14: Contract client sends a valid transferBatch request", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _coins = [_coin3, _coin1, _coin2]; +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _values = [_value1, _value2, _value3]; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// coinId1 = await bts_coreV2.coinId(_coins[0]); +// coinId2 = await bts_coreV2.coinId(_coins[1]); +// coinId3 = await bts_coreV2.coinId(_coins[2]); +// await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); +// await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); +// await holder.setApprove(coinId3, bts_coreV2.address, _values[2]); +// let tx = await holder.callTransferBatch( +// bts_coreV2.address, +// _coins, +// _values, +// _to, +// 0 +// ); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _coins +// ); +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferStart", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, holder.address); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 4); +// assert.equal(event._assetDetails.length, 3); +// assert.equal(event._assetDetails[0].coinName, _coin3); +// assert.equal(event._assetDetails[0].value, _value1 - chargedFee1); +// assert.equal(event._assetDetails[0].fee, chargedFee1); +// assert.equal(event._assetDetails[1].coinName, _coin1); +// assert.equal(event._assetDetails[1].value, _value2 - chargedFee2); +// assert.equal(event._assetDetails[1].fee, chargedFee2); +// assert.equal(event._assetDetails[2].coinName, _coin2); +// assert.equal(event._assetDetails[2].value, _value3 - chargedFee3); +// assert.equal(event._assetDetails[2].fee, chargedFee3); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 4); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// holder.address +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _coin3 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// _value1 - chargedFee1 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), +// _coin1 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), +// _value2 - chargedFee2 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), +// _coin2 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), +// _value3 - chargedFee3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// _value1 + chargedFee1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// _value2 + 2 * chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// _value3 + 2 * chargedFee3 +// ); +// }); +// +// it("Scenario 15: BTSPeriphery receives an error response of a recent request", async () => { +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _coins = [_coin3, _coin1, _coin2]; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let _responseMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_ERR, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 4, _responseMsg); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _coins +// ); +// +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferEnd", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, holder.address); +// assert.equal(event._sn, 4); +// assert.equal(event._code, 1); +// assert.equal(event._response, ""); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() + +// _value1 - +// chargedFee1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() + +// _value2 - +// chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() + +// _value3 - +// chargedFee3 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// 2 * chargedFee1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 3 * chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 3 * chargedFee3 +// ); +// }); +// +// // This test is replicated from Scenario 10 +// it("Scenario 16: Contract client sends a valid transferBatch request", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _values = [_value2, _value3]; +// let _query = [_native, _coin1, _coin2]; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// coinId1 = await bts_coreV2.coinId(_coins[0]); +// coinId2 = await bts_coreV2.coinId(_coins[1]); +// await holder.setApprove(coinId1, bts_coreV2.address, _values[0]); +// await holder.setApprove(coinId2, bts_coreV2.address, _values[1]); +// let tx = await holder.callTransferBatch( +// bts_coreV2.address, +// _coins, +// _values, +// _to, +// _value1 +// ); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _query +// ); +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferStart", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, holder.address); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 5); +// assert.equal(event._assetDetails.length, 3); +// assert.equal(event._assetDetails[0].coinName, _coin1); +// assert.equal(event._assetDetails[0].value, _value2 - chargedFee2); +// assert.equal(event._assetDetails[0].fee, chargedFee2); +// assert.equal(event._assetDetails[1].coinName, _coin2); +// assert.equal(event._assetDetails[1].value, _value3 - chargedFee3); +// assert.equal(event._assetDetails[1].fee, chargedFee3); +// assert.equal(event._assetDetails[2].coinName, _native); +// assert.equal(event._assetDetails[2].value, _value1 - chargedFee1); +// assert.equal(event._assetDetails[2].fee, chargedFee1); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 5); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// holder.address +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _coin1 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// _value2 - chargedFee2 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), +// _coin2 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), +// _value3 - chargedFee3 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), +// _native +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), +// _value1 - chargedFee1 +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt + 2 * _value1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// _value2 + 3 * chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// _value3 + 3 * chargedFee3 +// ); +// }); +// +// it("Scenario 17: BTSPeriphery receives an error response of a recent request", async () => { +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _coins = [_native, _coin1, _coin2]; +// let balanceBefore = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let _responseMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_ERR, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 5, _responseMsg); +// let balanceAfter = await bts_coreV2.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let bts_core_balance = await bts_coreV2.getBalanceOfBatch( +// bts_coreV2.address, +// _coins +// ); +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_peripheryV2.getPastEvents( +// "TransferEnd", +// { fromBlock: tx.receipt.blockNumber, toBlock: "latest" } +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, holder.address); +// assert.equal(event._sn, 5); +// assert.equal(event._code, 1); +// assert.equal(event._response, ""); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() + +// _value2 - +// chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() + +// _value3 - +// chargedFee3 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._refundableBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._refundableBalances[0]).toNumber(), +// _value1 - chargedFee1 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt + 2 * _value1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 4 * chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 4 * chargedFee3 +// ); +// }); +// }); +// }); diff --git a/solidity/bts/test/integration/2-native-coin-bts.js b/solidity/bts/test/integration/2-native-coin-bts.js index 463ec9fae..38f590060 100644 --- a/solidity/bts/test/integration/2-native-coin-bts.js +++ b/solidity/bts/test/integration/2-native-coin-bts.js @@ -1,6 +1,6 @@ const MockBTSPeriphery = artifacts.require("MockBTSPeriphery"); const BTSPeriphery = artifacts.require("BTSPeriphery"); -const BTSCore = artifacts.require("BTSCore"); +const BTSCore = artifacts.require("MockBTSCore"); const BMC = artifacts.require("MockBMC"); const Holder = artifacts.require("Holder"); const NotPayable = artifacts.require("NotPayable"); @@ -20,7 +20,7 @@ let toHex = (buf) => { contract("PRA BTSCore Query and Management", (accounts) => { let bts_core, bts_periphery; let _native = "PARA"; - let service = "Coin/WrappedCoin"; + let service = "bts"; let _net = "1234.iconee"; let _bmcICON = "btp://1234.iconee/0x1234567812345678"; let REPONSE_HANDLE_SERVICE = 2; @@ -94,26 +94,13 @@ contract("PRA BTSCore Query and Management", (accounts) => { await bmc.receiveResponse(_net, service, 1, _msg); }); - it.skip(`Scenario 7: Contract’s owner updates a new URI`, async () => { - let new_uri = "https://1234.iconee/"; - await bts_core.updateUri(new_uri); - }); - - it.skip("Scenario 8: Non-ownership role client updates a new URI", async () => { - let new_uri = "https://1234.iconee/"; - await truffleAssert.reverts( - bts_core.updateUri.call(new_uri, {from: accounts[1]}), - "Unauthorized" - ); - }); - it(`Scenario 9: Contract's owner updates fee ratio`, async () => { let new_fee = 20; let _feeNumerator = 100; let _name = "ICON"; await bts_core.setFeeRatio(_name, _feeNumerator, new_fee); - let fees = await bts_core.feeRatios(_name); + let fees = await bts_core.feeRatio(_name); assert( web3.utils.BN(fees._fixedFee).toNumber() === new_fee ); @@ -129,7 +116,7 @@ contract("PRA BTSCore Query and Management", (accounts) => { "Unauthorized" ); - let fees = await bts_core.feeRatios(_name); + let fees = await bts_core.feeRatio(_name); assert( web3.utils.BN(fees._fixedFee).toNumber() === old_fee ); @@ -145,7 +132,7 @@ contract("PRA BTSCore Query and Management", (accounts) => { "InvalidSetting" ); - let fees = await bts_core.feeRatios(_name); + let fees = await bts_core.feeRatio(_name); assert( web3.utils.BN(fees._feeNumerator).toNumber() === old_feeNumerator @@ -157,7 +144,7 @@ contract("PRA BTSCore Query and Management", (accounts) => { let _feeNumerator = 100; let _name = "ICON"; await bts_core.setFeeRatio(_name, _feeNumerator, new_fixed_fee); - let fees = await bts_core.feeRatios(_name); + let fees = await bts_core.feeRatio(_name); assert( web3.utils.BN(fees._fixedFee).toNumber() === @@ -174,29 +161,13 @@ contract("PRA BTSCore Query and Management", (accounts) => { bts_core.setFeeRatio.call(_name, _feeNumerator, new_fixed_fee, {from: accounts[1]}), "Unauthorized" ); - let fees = await bts_core.feeRatios(_name); + let fees = await bts_core.feeRatio(_name); assert( web3.utils.BN(fees._fixedFee).toNumber() === old_fixed_fee ); }); - it("Scenario 14: Owner set fixed fee is zero", async () => { - let old_fixed_fee = 1000000; - let new_fixed_fee = 0; - let _feeNumerator = 100; - let _name = "ICON"; - await truffleAssert.reverts( - bts_core.setFeeRatio.call(_name, _feeNumerator, new_fixed_fee), - "Fees cannot be set 0" - ); - let fees = await bts_core.feeRatios(_name); - - assert( - web3.utils.BN(fees._fixedFee).toNumber() === - old_fixed_fee - ); - }); it("Scenario 15: Query a valid supporting coin", async () => { let _name1 = "wBTC"; @@ -217,7 +188,10 @@ contract("PRA BTSCore Query and Management", (accounts) => { it("Scenario 16: Query an invalid supporting coin", async () => { let _query = "EOS"; let result = await bts_core.coinId(_query); - assert(web3.utils.BN(result).toNumber() === 0); + assert(web3.utils.toChecksumAddress(result) === + web3.utils.toChecksumAddress( + "0x0000000000000000000000000000000000000000" + )); }); it("Scenario 17: Non-Owner tries to add a new Owner", async () => { @@ -291,22 +265,12 @@ contract("PRA BTSCore Query and Management", (accounts) => { }); }); - it.skip("Scenario 23: New owner updates the new URI", async () => { - let new_uri = "https://1234.iconee/"; - await bts_core.updateUri(new_uri, {from: accounts[1]}); - }); - - it.skip("Scenario 24: Old owner updates the new URI", async () => { - let new_uri = "https://1234.iconee/"; - await bts_core.updateUri(new_uri, {from: accounts[0]}); - }); - it("Scenario 25: New owner updates new fee ratio", async () => { let new_fee = 30; let _feeNumerator = 100; let _name = "ICON"; await bts_core.setFeeRatio(_name, _feeNumerator, new_fee, {from: accounts[1]}); - let fees = await bts_core.feeRatios(_name); + let fees = await bts_core.feeRatio(_name); assert( web3.utils.BN(fees._fixedFee).toNumber() === new_fee @@ -318,7 +282,7 @@ contract("PRA BTSCore Query and Management", (accounts) => { let _feeNumerator = 100; let _name = "ICON"; await bts_core.setFeeRatio(_name, _feeNumerator, new_fee); - let fees = await bts_core.feeRatios(_name); + let fees = await bts_core.feeRatio(_name); assert( web3.utils.BN(fees._fixedFee).toNumber() === new_fee ); @@ -329,7 +293,7 @@ contract("PRA BTSCore Query and Management", (accounts) => { let _feeNumerator = 100; let _name = "ICON"; await bts_core.setFeeRatio(_name, _feeNumerator, new_fixed_fee, {from: accounts[1]}); - let fees = await bts_core.feeRatios(_name); + let fees = await bts_core.feeRatio(_name); assert( web3.utils.BN(fees._fixedFee).toNumber() === @@ -342,7 +306,7 @@ contract("PRA BTSCore Query and Management", (accounts) => { let _feeNumerator = 100; let _name = "ICON"; await bts_core.setFeeRatio(_name, _feeNumerator, new_fixed_fee); - let fees = await bts_core.feeRatios(_name); + let fees = await bts_core.feeRatio(_name); assert( web3.utils.BN(fees._fixedFee).toNumber() === @@ -421,14 +385,6 @@ contract("PRA BTSCore Query and Management", (accounts) => { ); }); - it.skip("Scenario 34: Removed Owner tries to update the new URI", async () => { - let new_uri = "https://1234.iconee/"; - await truffleAssert.reverts( - bts_core.updateUri.call(new_uri, {from: accounts[0]}), - "Unauthorized" - ); - }); - it("Scenario 35: Removed Owner tries to update new fee ratio", async () => { let new_fee = 30; let _feeNumerator = 100; @@ -442,7 +398,7 @@ contract("PRA BTSCore Query and Management", (accounts) => { contract("As a user, I want to send PRA to ICON blockchain", (accounts) => { let bts_periphery, bts_core, bmc, nonrefundable, refundable; - let service = "Coin/WrappedCoin"; + let service = "bts"; let _bmcICON = "btp://1234.iconee/0x1234567812345678"; let _net = "1234.iconee"; let _to = "btp://1234.iconee/0x12345678"; @@ -460,8 +416,8 @@ contract("As a user, I want to send PRA to ICON blockchain", (accounts) => { bts_core = await BTSCore.new(); bmc = await BMC.new("1234.pra"); encode_msg = await EncodeMsg.new(); - await bts_periphery.initialize(bmc.address, bts_core.address); await bts_core.initialize(_native, _fee, _fixed_fee); + await bts_periphery.initialize(bmc.address, bts_core.address); await bts_core.updateBTSPeriphery(bts_periphery.address); nonrefundable = await NonRefundable.new(); refundable = await Refundable.new(); @@ -512,17 +468,17 @@ contract("As a user, I want to send PRA to ICON blockchain", (accounts) => { ); }); - it("Scenario 4: Transferring to an invalid network/not supported network", async () => { - let invalid_destination = "btp://1234.eos/0x12345678"; - let amount = 600000; - await truffleAssert.reverts( - bts_core.transferNativeCoin.call(invalid_destination, { - from: accounts[1], - value: amount, - }), - "LimitExceed" - ); - }); + // it("Scenario 4: Transferring to an invalid network/not supported network", async () => { + // let invalid_destination = "btp://1234.eos/0x12345678"; + // let amount = 600000; + // await truffleAssert.reverts( + // bts_core.transferNativeCoin.call(invalid_destination, { + // from: accounts[1], + // value: amount, + // }), + // "LimitExceed" + // ); + // }); it("Scenario 5: Account client transfers a valid native coin to a side chain", async () => { let amount = 600000; @@ -600,7 +556,7 @@ contract("As a user, I want to send PRA to ICON blockchain", (accounts) => { ); assert( - web3.utils.BN(bts_coin_balance._usableBalance).toNumber() === + web3.utils.BN(bts_coin_balance._userBalance).toNumber() === amount && web3.utils .BN(account_balanceBefore._lockedBalance) @@ -656,21 +612,87 @@ contract("As a user, I want to send PRA to ICON blockchain", (accounts) => { ); }); - // it("Scenario 5: Account client transfers a valid native coin to a side chain", async () => { + // it("Scenario 7: BTSPeriphery receives an error response of a recent request", async () => { // let amount = 600000; + // let chargedFee = Math.floor(amount / 1000) + _fixed_fee; // let account_balanceBefore = await bts_core.balanceOf( // accounts[0], // _native // ); - // let tx = await bts_core.transferNativeCoin(_to, { - // from: accounts[0], - // value: amount, - // }); + // let bts_coin_balance_before = await bts_core.balanceOf( + // bts_core.address, + // _native + // ); + // let _msg = await encode_msg.encodeResponseMsg( + // REPONSE_HANDLE_SERVICE, + // RC_ERR, + // "" + // ); + // let tx = await bmc.receiveResponse(_net, service, 2, _msg); // let account_balanceAfter = await bts_core.balanceOf( // accounts[0], // _native // ); - // let bts_coin_balance = await bts_core.balanceOf( + // let bts_coin_balance_after = await bts_core.balanceOf( + // bts_core.address, + // _native + // ); + // + // const transferEvents = await bts_periphery.getPastEvents( + // "TransferEnd", + // { + // fromBlock: tx.receipt.blockNumber, + // toBlock: "latest", + // } + // ); + // let event = transferEvents[0].returnValues; + // + // assert.equal(event._from, accounts[0]); + // assert.equal(event._sn, 2); + // assert.equal(event._code, 1); + // assert.equal(event._response, ""); + // + // // Unable to check balance of accounts[0] since this account has also paid gas fee + // // It would be easier to check if this is a contract + // // Requestor will be receive an amount of refund as + // // refund = amount - chargeAmt + // assert( + // web3.utils.BN(account_balanceBefore._lockedBalance).toNumber() === + // amount && + // web3.utils + // .BN(account_balanceAfter._lockedBalance) + // .toNumber() === 0 && + // web3.utils + // .BN(account_balanceAfter._refundableBalance) + // .toNumber() === 0 && + // web3.utils + // .BN(bts_coin_balance_before._usableBalance) + // .toNumber() === + // 2 * amount && + // web3.utils + // .BN(bts_coin_balance_after._usableBalance) + // .toNumber() === + // amount + chargedFee + // ); + // }); + // + // it("Scenario 8: Non-refundable contract transfers a valid native coin to a side chain", async () => { + // let amount = 600000; + // await nonrefundable.deposit({from: accounts[2], value: deposit}); + // let contract_balanceBefore = await bts_core.balanceOf( + // nonrefundable.address, + // _native + // ); + // let bts_coin_balance_before = await bts_core.balanceOf( + // bts_core.address, + // _native + // ); + // let tx = await nonrefundable.transfer(bts_core.address, _to, amount); + // let contract_balanceAfter = await bts_core.balanceOf( + // nonrefundable.address, + // _native + // ); + // let bts_coin_balance_after = await bts_core.balanceOf( // bts_core.address, // _native // ); @@ -684,9 +706,9 @@ contract("As a user, I want to send PRA to ICON blockchain", (accounts) => { // } // ); // let event = transferEvents[0].returnValues; - // assert.equal(event._from, accounts[0]); + // assert.equal(event._from, nonrefundable.address); // assert.equal(event._to, _to); - // assert.equal(event._sn, 2); + // assert.equal(event._sn, 3); // assert.equal(event._assetDetails.length, 1); // assert.equal(event._assetDetails[0].coinName, "PARA"); // assert.equal(event._assetDetails[0].value, amount - chargedFee); @@ -708,7 +730,7 @@ contract("As a user, I want to send PRA to ICON blockchain", (accounts) => { // assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); // assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); // assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - // assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 2); + // assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 3); // // const ServiceMsg = rlp.decode(bmcMsg[4]); // assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); @@ -716,7 +738,7 @@ contract("As a user, I want to send PRA to ICON blockchain", (accounts) => { // const coinTransferMsg = rlp.decode(ServiceMsg[1]); // assert.equal( // web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - // accounts[0] + // nonrefundable.address // ); // assert.equal( // web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), @@ -732,4160 +754,4003 @@ contract("As a user, I want to send PRA to ICON blockchain", (accounts) => { // ); // // assert( - // web3.utils.BN(bts_coin_balance._usableBalance).toNumber() === - // 2 * amount && - // web3.utils - // .BN(account_balanceBefore._lockedBalance) - // .toNumber() === 0 && - // web3.utils - // .BN(account_balanceAfter._lockedBalance) - // .toNumber() === amount + // web3.utils.BN(contract_balanceBefore._usableBalance).toNumber() === + // web3.utils.BN(contract_balanceAfter._usableBalance).toNumber() + + // amount && + // web3.utils + // .BN(contract_balanceBefore._lockedBalance) + // .toNumber() === 0 && + // web3.utils + // .BN(contract_balanceAfter._lockedBalance) + // .toNumber() === amount && + // web3.utils + // .BN(bts_coin_balance_before._usableBalance) + // .toNumber() === + // amount + chargedFee && + // web3.utils + // .BN(bts_coin_balance_after._usableBalance) + // .toNumber() === + // 2 * amount + chargedFee // ); // }); + // + // it(`Scenario 9: BTSPeriphery receives an error response of a recent request and fails to refund coins back to Non-refundable contract`, async () => { + // let amount = 600000; + // let chargedFee = Math.floor(amount / 1000) + _fixed_fee; + // let contract_balanceBefore = await bts_core.balanceOf( + // nonrefundable.address, + // _native + // ); + // let bts_coin_balance_before = await bts_core.balanceOf( + // bts_core.address, + // _native + // ); + // let _msg = await encode_msg.encodeResponseMsg( + // REPONSE_HANDLE_SERVICE, + // RC_ERR, + // "" + // ); + // let tx = await bmc.receiveResponse(_net, service, 3, _msg); + // let contract_balanceAfter = await bts_core.balanceOf( + // nonrefundable.address, + // _native + // ); + // let bts_coin_balance_after = await bts_core.balanceOf( + // bts_core.address, + // _native + // ); + // + // const transferEvents = await bts_periphery.getPastEvents( + // "TransferEnd", + // { + // fromBlock: tx.receipt.blockNumber, + // toBlock: "latest", + // } + // ); + // let event = transferEvents[0].returnValues; + // + // assert.equal(event._from, nonrefundable.address); + // assert.equal(event._sn, 3); + // assert.equal(event._code, 1); + // assert.equal(event._response, ""); + // + // assert.equal( + // web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), + // amount + // ); + // assert.equal( + // web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), + // 0 + // ); + // assert.equal( + // web3.utils.BN(contract_balanceBefore._usableBalance).toNumber(), + // web3.utils.BN(contract_balanceAfter._usableBalance).toNumber() + // ); + // assert.equal( + // web3.utils.BN(contract_balanceAfter._refundableBalance).toNumber(), + // amount - chargedFee + // ); + // assert.equal( + // web3.utils.BN(bts_coin_balance_before._usableBalance).toNumber(), + // web3.utils.BN(bts_coin_balance_after._usableBalance).toNumber() + // ); + // }); + // + // it("Scenario 10: Refundable contract transfers a valid native coin to a side chain", async () => { + // let amount = 600000; + // await refundable.deposit({from: accounts[2], value: deposit}); + // let contract_balanceBefore = await bts_core.balanceOf( + // refundable.address, + // _native + // ); + // let bts_coin_balance_before = await bts_core.balanceOf( + // bts_core.address, + // _native + // ); + // let tx = await refundable.transfer(bts_core.address, _to, amount); + // let contract_balanceAfter = await bts_core.balanceOf( + // refundable.address, + // _native + // ); + // let bts_coin_balance_after = await bts_core.balanceOf( + // bts_core.address, + // _native + // ); + // let chargedFee = Math.floor(amount / 1000) + _fixed_fee; + // + // const transferEvents = await bts_periphery.getPastEvents( + // "TransferStart", + // { + // fromBlock: tx.receipt.blockNumber, + // toBlock: "latest", + // } + // ); + // let event = transferEvents[0].returnValues; + // assert.equal(event._from, refundable.address); + // assert.equal(event._to, _to); + // assert.equal(event._sn, 4); + // assert.equal(event._assetDetails.length, 1); + // assert.equal(event._assetDetails[0].coinName, "PARA"); + // assert.equal(event._assetDetails[0].value, amount - chargedFee); + // assert.equal(event._assetDetails[0].fee, chargedFee); + // + // const linkStatus = await bmc.getStatus(_bmcICON); + // const bmcBtpAddress = await bmc.getBmcBtpAddress(); + // + // const messageEvents = await bmc.getPastEvents("Message", { + // fromBlock: tx.receipt.blockNumber, + // toBlock: "latest", + // }); + // event = messageEvents[0].returnValues; + // assert.equal(event._next, _bmcICON); + // assert.equal(event._seq, linkStatus.txSeq); + // + // const bmcMsg = rlp.decode(event._msg); + // + // assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); + // assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); + // assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); + // assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 4); + // + // const ServiceMsg = rlp.decode(bmcMsg[4]); + // assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); + // + // const coinTransferMsg = rlp.decode(ServiceMsg[1]); + // assert.equal( + // web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), + // refundable.address + // ); + // assert.equal( + // web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), + // _to.split("/").slice(-1)[0] + // ); + // assert.equal( + // web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), + // _native + // ); + // assert.equal( + // web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), + // amount - chargedFee + // ); + // + // assert.equal( + // web3.utils.BN(contract_balanceBefore._usableBalance).toNumber(), + // web3.utils.BN(contract_balanceAfter._usableBalance).toNumber() + + // amount + // ); + // assert.equal( + // web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), + // 0 + // ); + // assert.equal( + // web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), + // amount + // ); + // assert.equal( + // web3.utils.BN(bts_coin_balance_after._usableBalance).toNumber(), + // web3.utils.BN(bts_coin_balance_before._usableBalance).toNumber() + + // amount + // ); + // }); + // + // it("Scenario 11: BTSPeriphery receives an error response of a recent request", async () => { + // let amount = 600000; + // let chargedFee = Math.floor(amount / 1000) + _fixed_fee; + // let contract_balanceBefore = await bts_core.balanceOf( + // refundable.address, + // _native + // ); + // let bts_coin_balance_before = await bts_core.balanceOf( + // bts_core.address, + // _native + // ); + // let _msg = await encode_msg.encodeResponseMsg( + // REPONSE_HANDLE_SERVICE, + // RC_ERR, + // "" + // ); + // let tx = await bmc.receiveResponse(_net, service, 4, _msg); + // let contract_balanceAfter = await bts_core.balanceOf( + // refundable.address, + // _native + // ); + // let bts_coin_balance_after = await bts_core.balanceOf( + // bts_core.address, + // _native + // ); + // + // const transferEvents = await bts_periphery.getPastEvents( + // "TransferEnd", + // { + // fromBlock: tx.receipt.blockNumber, + // toBlock: "latest", + // } + // ); + // let event = transferEvents[0].returnValues; + // + // assert.equal(event._from, refundable.address); + // assert.equal(event._sn, 4); + // assert.equal(event._code, 1); + // assert.equal(event._response, ""); + // + // assert.equal( + // web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), + // amount + // ); + // assert.equal( + // web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), + // 0 + // ); + // assert.equal( + // web3.utils.BN(contract_balanceAfter._usableBalance).toNumber(), + // web3.utils.BN(contract_balanceBefore._usableBalance).toNumber() + + // amount - + // chargedFee + // ); + // assert.equal( + // web3.utils.BN(contract_balanceAfter._refundableBalance).toNumber(), + // 0 + // ); + // assert.equal( + // web3.utils.BN(bts_coin_balance_before._usableBalance).toNumber(), + // web3.utils.BN(bts_coin_balance_after._usableBalance).toNumber() + + // amount - + // chargedFee + // ); + // }); +}); +// +// contract("As a user, I want to send ERC1155_ICX to ICON blockchain", (accounts) => { +// let bts_periphery, bts_core, bmc, holder; +// let service = "Coin/WrappedCoin"; +// let _uri = "https://github.com/icon-project/icon-bridge"; +// let _native = "PARA"; +// let _fee = 10; +// let _fixed_fee = 500000; +// let _name = "ICON"; +// let _bmcICON = "btp://1234.iconee/0x1234567812345678"; +// let _net = "1234.iconee"; +// let _from = "0x12345678"; +// let _value = 999999999999999; +// let REPONSE_HANDLE_SERVICE = 2; +// let RC_OK = 0; +// let RC_ERR = 1; +// +// before(async () => { +// bts_periphery = await BTSPeriphery.new(); +// bts_core = await BTSCore.new(); +// bmc = await BMC.new("1234.pra"); +// encode_msg = await EncodeMsg.new(); +// await bts_periphery.initialize( +// bmc.address, +// bts_core.address, +// service +// ); +// await bts_core.initialize(_native, _fee, _fixed_fee); +// await bts_core.updateBTSPeriphery(bts_periphery.address); +// holder = await Holder.new(); +// await bmc.addService(service, bts_periphery.address); +// await bmc.addVerifier(_net, accounts[1]); +// await bmc.addLink(_bmcICON); +// await holder.addBSHContract( +// bts_periphery.address, +// bts_core.address +// ); +// await bts_core.register(_name, "", 18); +// let _msg = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// holder.address, +// _name, +// _value +// ); +// await bmc.receiveRequest(_bmcICON, "", service, 0, _msg); +// id = await bts_core.coinId(_name, "", 18); +// }); +// +// it("Scenario 1: User has not yet set approval for token being transferred out by Operator", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _value = 600000; +// let balanceBefore = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// await truffleAssert.reverts( +// holder.callTransfer.call(_name, _value, _to), +// "ERC1155: caller is not owner nor approved" +// ); +// let balanceAfter = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// }); +// +// it(`Scenario 2: User has set approval, but user's balance has insufficient amount`, async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _value = 9999999999999999n; +// let balanceBefore = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// await holder.setApprove(bts_core.address); +// await truffleAssert.reverts( +// holder.callTransfer.call(_name, _value, _to), +// "ERC1155: insufficient balance for transfer" +// ); +// let balanceAfter = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 3: User requests to transfer an invalid Token", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _value = 9999999999999999n; +// let _token = "EOS"; +// await holder.setApprove(bts_core.address); +// await truffleAssert.reverts( +// holder.callTransfer.call(_token, _value, _to), +// "UnregisterCoin" +// ); +// }); +// +// it("Scenario 4: User transfers Tokens to an invalid BTP Address format", async () => { +// let _to = "1234.iconee/0x12345678"; +// let amount = 600000; +// let contract_balanceBefore = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// await holder.setApprove(bts_core.address); +// await truffleAssert.reverts( +// holder.callTransfer.call(_name, amount, _to), +// "VM Exception while processing transaction: revert" +// ); +// let contract_balanceAfter = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// let bts_core_balance = await bts_core.balanceOf( +// bts_core.address, +// _name +// ); +// +// assert.equal( +// web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(contract_balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(contract_balanceBefore._usableBalance).toNumber() +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalance).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 5: User requests to transfer zero Token", async () => { +// let _to = "1234.iconee/0x12345678"; +// let balanceBefore = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// await holder.setApprove(bts_core.address); +// await truffleAssert.reverts( +// holder.callTransfer.call(_name, 0, _to), +// "revert" +// ); +// let balanceAfter = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() +// ); +// }); +// +// it("Scenario 6: Transferring amount is less than fixed fee", async () => { +// let _to = "1234.iconee/0x12345678"; +// let _name = "ICON"; +// let amount = 100000; +// let balanceBefore = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// await holder.setApprove(bts_core.address); +// await truffleAssert.reverts( +// holder.callTransfer.call(_name, amount, _to), +// "revert" +// ); +// let balanceAfter = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() +// ); +// }); +// +// it("Scenario 7: User requests to transfer to an invalid network/Not Supported Network", async () => { +// let _to = "btp://1234.eos/0x12345678"; +// let _name = "ICON"; +// let amount = 600000; +// let balanceBefore = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// await holder.setApprove(bts_core.address); +// await truffleAssert.reverts( +// holder.callTransfer.call(_name, amount, _to), +// "BMCRevertNotExistsBMV" +// ); +// let balanceAfter = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// let bts_core_balance = await bts_core.balanceOf( +// bts_core.address, +// _name +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalance).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 8: User sends a valid transferring request", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let amount = 600000; +// let balanceBefore = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// await holder.setApprove(bts_core.address); +// let tx = await holder.callTransfer(_name, amount, _to); +// let balanceAfter = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// let bts_core_balance = await bts_core.balanceOf( +// bts_core.address, +// _name +// ); +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferStart", +// {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, holder.address); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 1); +// assert.equal(event._assetDetails.length, 1); +// assert.equal(event._assetDetails[0].coinName, _name); +// assert.equal(event._assetDetails[0].value, amount - chargedFee); +// assert.equal(event._assetDetails[0].fee, chargedFee); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 1); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// holder.address +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _name +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// amount - chargedFee +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// amount +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() - amount +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalance).toNumber(), +// amount +// ); +// }); +// +// it("Scenario 9: BTSPeriphery receives a successful response of a recent request", async () => { +// let amount = 600000; +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// let contract_balanceBefore = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// let _msg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_OK, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 1, _msg); +// let contract_balanceAfter = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// let fees = await bts_core.getAccumulatedFees(); +// let bts_core_balance = await bts_core.balanceOf( +// bts_core.address, +// _name +// ); +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferEnd", +// {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, holder.address); +// assert.equal(event._sn, 1); +// assert.equal(event._code, 0); +// assert.equal(event._response, ""); +// +// assert.equal( +// web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), +// amount +// ); +// assert.equal( +// web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(contract_balanceBefore._usableBalance).toNumber(), +// web3.utils.BN(contract_balanceAfter._usableBalance).toNumber() +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalance).toNumber(), +// chargedFee +// ); +// assert.equal(fees[1].coinName, _name); +// assert.equal(Number(fees[1].value), chargedFee); +// }); +// +// it("Scenario 8: User sends a valid transferring request", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let amount = 100000000000000; +// let balanceBefore = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// let bts_core_balance_before = await bts_core.balanceOf( +// bts_core.address, +// _name +// ); +// await holder.setApprove(bts_core.address); +// let tx = await holder.callTransfer(_name, amount, _to); +// let balanceAfter = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// let bts_core_balance_after = await bts_core.balanceOf( +// bts_core.address, +// _name +// ); +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferStart", +// {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, holder.address); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 2); +// assert.equal(event._assetDetails.length, 1); +// assert.equal(event._assetDetails[0].coinName, _name); +// assert.equal(event._assetDetails[0].value, amount - chargedFee); +// assert.equal(event._assetDetails[0].fee, chargedFee); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 2); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// holder.address +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _name +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// amount - chargedFee +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// amount +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() - amount +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance_after._usableBalance).toNumber(), +// web3.utils +// .BN(bts_core_balance_before._usableBalance) +// .toNumber() + amount +// ); +// }); +// +// it("Scenario 10: BTSPeriphery receives an error response of a recent request", async () => { +// let amount = 100000000000000; +// let chargedFee = Math.floor(amount / 1000) + _fixed_fee; +// let balanceBefore = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// let _msg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_ERR, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 2, _msg); +// let balanceAfter = await bts_core.balanceOf( +// holder.address, +// _name +// ); +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferEnd", +// {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, holder.address); +// assert.equal(event._sn, 2); +// assert.equal(event._code, 1); +// assert.equal(event._response, ""); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalance).toNumber(), +// amount +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalance).toNumber(), +// web3.utils.BN(balanceBefore._usableBalance).toNumber() + +// amount - +// chargedFee +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._refundableBalance).toNumber(), +// 0 +// ); +// }); +// }); +// +contract("As a user, I want to receive PRA from ICON blockchain", (accounts) => { + let bmc, bts_periphery, bts_core, notpayable, refundable; + let service = "bts"; + let _bmcICON = "btp://1234.iconee/0x1234567812345678"; + let _net = "1234.iconee"; + let _to = "btp://1234.iconee/0x12345678"; + let _native = "PARA"; + let _fee = 10; + let _fixed_fee = 500000; + let RC_ERR = 1; + let RC_OK = 0; + let _uri = "https://github.com/icon-project/icon-bridge"; - it("Scenario 7: BTSPeriphery receives an error response of a recent request", async () => { - let amount = 600000; - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - let account_balanceBefore = await bts_core.balanceOf( - accounts[0], - _native - ); - let bts_coin_balance_before = await bts_core.balanceOf( - bts_core.address, - _native - ); - let _msg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 2, _msg); - let account_balanceAfter = await bts_core.balanceOf( - accounts[0], - _native - ); - let bts_coin_balance_after = await bts_core.balanceOf( - bts_core.address, - _native - ); - - const transferEvents = await bts_periphery.getPastEvents( - "TransferEnd", - { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, accounts[0]); - assert.equal(event._sn, 2); - assert.equal(event._code, 1); - assert.equal(event._response, ""); + before(async () => { + bts_periphery = await BTSPeriphery.new(); + bts_core = await BTSCore.new(); + bmc = await BMC.new("1234.pra"); + encode_msg = await EncodeMsg.new(); + await bts_core.initialize(_native, _fee, _fixed_fee); + await bts_periphery.initialize(bmc.address, bts_core.address); + await bts_core.updateBTSPeriphery(bts_periphery.address); + notpayable = await NotPayable.new(); + refundable = await Refundable.new(); + await bmc.addService(service, bts_periphery.address); + await bmc.addLink(_bmcICON); - // Unable to check balance of accounts[0] since this account has also paid gas fee - // It would be easier to check if this is a contract - // Requestor will be receive an amount of refund as - // refund = amount - chargeAmt - assert( - web3.utils.BN(account_balanceBefore._lockedBalance).toNumber() === - amount && - web3.utils - .BN(account_balanceAfter._lockedBalance) - .toNumber() === 0 && - web3.utils - .BN(account_balanceAfter._refundableBalance) - .toNumber() === 0 && - web3.utils - .BN(bts_coin_balance_before._usableBalance) - .toNumber() === - 2 * amount && - web3.utils - .BN(bts_coin_balance_after._usableBalance) - .toNumber() === - amount + chargedFee - ); + await bts_core.transferNativeCoin(_to, { + from: accounts[0], + value: 100000000, + }); + btpAddr = await bmc.bmcAddress(); }); - it("Scenario 8: Non-refundable contract transfers a valid native coin to a side chain", async () => { - let amount = 600000; - await nonrefundable.deposit({from: accounts[2], value: deposit}); - let contract_balanceBefore = await bts_core.balanceOf( - nonrefundable.address, - _native - ); - let bts_coin_balance_before = await bts_core.balanceOf( - bts_core.address, - _native + it("Scenario 1: Receiving address is invalid", async () => { + let _from = "0x12345678"; + let _value = 1000; + let _address = "0x1234567890123456789"; + let _eventMsg = await encode_msg.encodeResponseBMCMessage( + btpAddr, + _bmcICON, + service, + 10, + RC_ERR, + "InvalidAddress" ); - let tx = await nonrefundable.transfer(bts_core.address, _to, amount); - let contract_balanceAfter = await bts_core.balanceOf( - nonrefundable.address, - _native + let _msg = await encode_msg.encodeTransferMsgWithStringAddress( + _from, + _address, + _native, + _value ); - let bts_coin_balance_after = await bts_core.balanceOf( - bts_core.address, - _native + let output = await bmc.receiveRequest( + _bmcICON, + "", + service, + 10, + _msg ); - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - - const transferEvents = await bts_periphery.getPastEvents( - "TransferStart", - { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - } + assert( + output.logs[0].args._next === _bmcICON && + output.logs[0].args._msg === _eventMsg ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, nonrefundable.address); - assert.equal(event._to, _to); - assert.equal(event._sn, 3); - assert.equal(event._assetDetails.length, 1); - assert.equal(event._assetDetails[0].coinName, "PARA"); - assert.equal(event._assetDetails[0].value, amount - chargedFee); - assert.equal(event._assetDetails[0].fee, chargedFee); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 3); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); + }); - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - nonrefundable.address - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] + it("Scenario 2: BTSCore has insufficient funds to transfer", async () => { + let _from = "0x12345678"; + let _value = 1000000000; + let balanceBefore = await bmc.getBalance(accounts[1]); + let _eventMsg = await encode_msg.encodeResponseBMCMessage( + btpAddr, + _bmcICON, + service, + 10, + RC_ERR, + "TransferFailed" ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _native + let _msg = await encode_msg.encodeTransferMsgWithAddress( + _from, + accounts[1], + _native, + _value ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - amount - chargedFee + let output = await bmc.receiveRequest( + _bmcICON, + "", + service, + 10, + _msg ); + let balanceAfter = await bmc.getBalance(accounts[1]); - assert( - web3.utils.BN(contract_balanceBefore._usableBalance).toNumber() === - web3.utils.BN(contract_balanceAfter._usableBalance).toNumber() + - amount && - web3.utils - .BN(contract_balanceBefore._lockedBalance) - .toNumber() === 0 && - web3.utils - .BN(contract_balanceAfter._lockedBalance) - .toNumber() === amount && - web3.utils - .BN(bts_coin_balance_before._usableBalance) - .toNumber() === - amount + chargedFee && - web3.utils - .BN(bts_coin_balance_after._usableBalance) - .toNumber() === - 2 * amount + chargedFee + assert.equal( + web3.utils.BN(balanceAfter).toString(), + web3.utils.BN(balanceBefore).toString() ); + assert.equal(output.logs[0].args._next, _bmcICON); + assert.equal(output.logs[0].args._msg, _eventMsg); }); - it(`Scenario 9: BTSPeriphery receives an error response of a recent request and fails to refund coins back to Non-refundable contract`, async () => { - let amount = 600000; - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - let contract_balanceBefore = await bts_core.balanceOf( - nonrefundable.address, - _native - ); - let bts_coin_balance_before = await bts_core.balanceOf( - bts_core.address, - _native - ); - let _msg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, + it(`Scenario 3: BTSCore tries to transfer PARA coins to a non-payable contract, but it fails`, async () => { + let _from = "0x12345678"; + let _value = 1000; + let balanceBefore = await bmc.getBalance(notpayable.address); + let _eventMsg = await encode_msg.encodeResponseBMCMessage( + btpAddr, + _bmcICON, + service, + 10, RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 3, _msg); - let contract_balanceAfter = await bts_core.balanceOf( - nonrefundable.address, - _native + "TransferFailed" ); - let bts_coin_balance_after = await bts_core.balanceOf( - bts_core.address, - _native + let _msg = await encode_msg.encodeTransferMsgWithAddress( + _from, + notpayable.address, + _native, + _value ); - - const transferEvents = await bts_periphery.getPastEvents( - "TransferEnd", - { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - } + let output = await bmc.receiveRequest( + _bmcICON, + "", + service, + 10, + _msg ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, nonrefundable.address); - assert.equal(event._sn, 3); - assert.equal(event._code, 1); - assert.equal(event._response, ""); + let balanceAfter = await bmc.getBalance(notpayable.address); assert.equal( - web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), - amount + web3.utils.BN(balanceAfter).toNumber(), + web3.utils.BN(balanceBefore).toNumber() ); - assert.equal( - web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), - 0 + assert.equal(output.logs[0].args._next, _bmcICON); + assert.equal(output.logs[0].args._msg, _eventMsg); + }); + + it("Scenario 4: BTSPeriphery receives a request of transferring coins", async () => { + let _from = "0x12345678"; + let _value = 12345; + let balanceBefore = await bmc.getBalance(accounts[1]); + let _eventMsg = await encode_msg.encodeResponseBMCMessage( + btpAddr, + _bmcICON, + service, + 10, + RC_OK, + "" ); - assert.equal( - web3.utils.BN(contract_balanceBefore._usableBalance).toNumber(), - web3.utils.BN(contract_balanceAfter._usableBalance).toNumber() + let _msg = await encode_msg.encodeTransferMsgWithAddress( + _from, + accounts[1], + _native, + _value ); - assert.equal( - web3.utils.BN(contract_balanceAfter._refundableBalance).toNumber(), - amount - chargedFee + let output = await bmc.receiveRequest( + _bmcICON, + "", + service, + 10, + _msg ); + let balanceAfter = await bmc.getBalance(accounts[1]); + assert.equal( - web3.utils.BN(bts_coin_balance_before._usableBalance).toNumber(), - web3.utils.BN(bts_coin_balance_after._usableBalance).toNumber() + web3.utils.BN(balanceAfter).toString(), + web3.utils + .BN(balanceBefore) + .add(new web3.utils.BN(_value)) + .toString() ); + assert.equal(output.logs[0].args._next, _bmcICON); + assert.equal(output.logs[0].args._msg, _eventMsg); }); - it("Scenario 10: Refundable contract transfers a valid native coin to a side chain", async () => { - let amount = 600000; - await refundable.deposit({from: accounts[2], value: deposit}); - let contract_balanceBefore = await bts_core.balanceOf( - refundable.address, - _native + it(`Scenario 5: BTSPeriphery receives a request of transferring coins`, async () => { + let _from = "0x12345678"; + let _value = 23456; + let balanceBefore = await bmc.getBalance(refundable.address); + let _eventMsg = await encode_msg.encodeResponseBMCMessage( + btpAddr, + _bmcICON, + service, + 10, + RC_OK, + "" ); - let bts_coin_balance_before = await bts_core.balanceOf( - bts_core.address, - _native - ); - let tx = await refundable.transfer(bts_core.address, _to, amount); - let contract_balanceAfter = await bts_core.balanceOf( - refundable.address, - _native - ); - let bts_coin_balance_after = await bts_core.balanceOf( - bts_core.address, - _native - ); - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - - const transferEvents = await bts_periphery.getPastEvents( - "TransferStart", - { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - } - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, refundable.address); - assert.equal(event._to, _to); - assert.equal(event._sn, 4); - assert.equal(event._assetDetails.length, 1); - assert.equal(event._assetDetails[0].coinName, "PARA"); - assert.equal(event._assetDetails[0].value, amount - chargedFee); - assert.equal(event._assetDetails[0].fee, chargedFee); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 4); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - refundable.address - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _native - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - amount - chargedFee - ); - - assert.equal( - web3.utils.BN(contract_balanceBefore._usableBalance).toNumber(), - web3.utils.BN(contract_balanceAfter._usableBalance).toNumber() + - amount - ); - assert.equal( - web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), - amount - ); - assert.equal( - web3.utils.BN(bts_coin_balance_after._usableBalance).toNumber(), - web3.utils.BN(bts_coin_balance_before._usableBalance).toNumber() + - amount - ); - }); - - it("Scenario 11: BTSPeriphery receives an error response of a recent request", async () => { - let amount = 600000; - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - let contract_balanceBefore = await bts_core.balanceOf( - refundable.address, - _native - ); - let bts_coin_balance_before = await bts_core.balanceOf( - bts_core.address, - _native - ); - let _msg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 4, _msg); - let contract_balanceAfter = await bts_core.balanceOf( - refundable.address, - _native - ); - let bts_coin_balance_after = await bts_core.balanceOf( - bts_core.address, - _native - ); - - const transferEvents = await bts_periphery.getPastEvents( - "TransferEnd", - { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, refundable.address); - assert.equal(event._sn, 4); - assert.equal(event._code, 1); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), - amount - ); - assert.equal( - web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(contract_balanceAfter._usableBalance).toNumber(), - web3.utils.BN(contract_balanceBefore._usableBalance).toNumber() + - amount - - chargedFee - ); - assert.equal( - web3.utils.BN(contract_balanceAfter._refundableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_coin_balance_before._usableBalance).toNumber(), - web3.utils.BN(bts_coin_balance_after._usableBalance).toNumber() + - amount - - chargedFee - ); - }); -}); - -contract("As a user, I want to send ERC1155_ICX to ICON blockchain", (accounts) => { - let bts_periphery, bts_core, bmc, holder; - let service = "Coin/WrappedCoin"; - let _uri = "https://github.com/icon-project/icon-bridge"; - let _native = "PARA"; - let _fee = 10; - let _fixed_fee = 500000; - let _name = "ICON"; - let _bmcICON = "btp://1234.iconee/0x1234567812345678"; - let _net = "1234.iconee"; - let _from = "0x12345678"; - let _value = 999999999999999; - let REPONSE_HANDLE_SERVICE = 2; - let RC_OK = 0; - let RC_ERR = 1; - - before(async () => { - bts_periphery = await BTSPeriphery.new(); - bts_core = await BTSCore.new(); - bmc = await BMC.new("1234.pra"); - encode_msg = await EncodeMsg.new(); - await bts_periphery.initialize( - bmc.address, - bts_core.address, - service - ); - await bts_core.initialize(_native, _fee, _fixed_fee); - await bts_core.updateBTSPeriphery(bts_periphery.address); - holder = await Holder.new(); - await bmc.addService(service, bts_periphery.address); - await bmc.addVerifier(_net, accounts[1]); - await bmc.addLink(_bmcICON); - await holder.addBSHContract( - bts_periphery.address, - bts_core.address - ); - await bts_core.register(_name, "", 18); - let _msg = await encode_msg.encodeTransferMsgWithAddress( + let _msg = await encode_msg.encodeTransferMsgWithStringAddress( _from, - holder.address, - _name, + refundable.address, + _native, _value ); - await bmc.receiveRequest(_bmcICON, "", service, 0, _msg); - id = await bts_core.coinId(_name, "", 18); - }); - - it("Scenario 1: User has not yet set approval for token being transferred out by Operator", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _value = 600000; - let balanceBefore = await bts_core.balanceOf( - holder.address, - _name - ); - await truffleAssert.reverts( - holder.callTransfer.call(_name, _value, _to), - "ERC1155: caller is not owner nor approved" - ); - let balanceAfter = await bts_core.balanceOf( - holder.address, - _name - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - 0 - ); - }); - - it(`Scenario 2: User has set approval, but user's balance has insufficient amount`, async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _value = 9999999999999999n; - let balanceBefore = await bts_core.balanceOf( - holder.address, - _name - ); - await holder.setApprove(bts_core.address); - await truffleAssert.reverts( - holder.callTransfer.call(_name, _value, _to), - "ERC1155: insufficient balance for transfer" - ); - let balanceAfter = await bts_core.balanceOf( - holder.address, - _name - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - 0 - ); - }); - - it("Scenario 3: User requests to transfer an invalid Token", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _value = 9999999999999999n; - let _token = "EOS"; - await holder.setApprove(bts_core.address); - await truffleAssert.reverts( - holder.callTransfer.call(_token, _value, _to), - "UnregisterCoin" - ); - }); - - it("Scenario 4: User transfers Tokens to an invalid BTP Address format", async () => { - let _to = "1234.iconee/0x12345678"; - let amount = 600000; - let contract_balanceBefore = await bts_core.balanceOf( - holder.address, - _name - ); - await holder.setApprove(bts_core.address); - await truffleAssert.reverts( - holder.callTransfer.call(_name, amount, _to), - "VM Exception while processing transaction: revert" - ); - let contract_balanceAfter = await bts_core.balanceOf( - holder.address, - _name - ); - let bts_core_balance = await bts_core.balanceOf( - bts_core.address, - _name - ); - - assert.equal( - web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(contract_balanceAfter._usableBalance).toNumber(), - web3.utils.BN(contract_balanceBefore._usableBalance).toNumber() - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalance).toNumber(), - 0 - ); - }); - - it("Scenario 5: User requests to transfer zero Token", async () => { - let _to = "1234.iconee/0x12345678"; - let balanceBefore = await bts_core.balanceOf( - holder.address, - _name - ); - await holder.setApprove(bts_core.address); - await truffleAssert.reverts( - holder.callTransfer.call(_name, 0, _to), - "revert" - ); - let balanceAfter = await bts_core.balanceOf( - holder.address, - _name - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() - ); - }); - - it("Scenario 6: Transferring amount is less than fixed fee", async () => { - let _to = "1234.iconee/0x12345678"; - let _name = "ICON"; - let amount = 100000; - let balanceBefore = await bts_core.balanceOf( - holder.address, - _name - ); - await holder.setApprove(bts_core.address); - await truffleAssert.reverts( - holder.callTransfer.call(_name, amount, _to), - "revert" - ); - let balanceAfter = await bts_core.balanceOf( - holder.address, - _name - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() - ); - }); - - it("Scenario 7: User requests to transfer to an invalid network/Not Supported Network", async () => { - let _to = "btp://1234.eos/0x12345678"; - let _name = "ICON"; - let amount = 600000; - let balanceBefore = await bts_core.balanceOf( - holder.address, - _name - ); - await holder.setApprove(bts_core.address); - await truffleAssert.reverts( - holder.callTransfer.call(_name, amount, _to), - "BMCRevertNotExistsBMV" - ); - let balanceAfter = await bts_core.balanceOf( - holder.address, - _name - ); - let bts_core_balance = await bts_core.balanceOf( - bts_core.address, - _name + let output = await bmc.receiveRequest( + _bmcICON, + "", + service, + 10, + _msg ); + let balanceAfter = await bmc.getBalance(refundable.address); assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalance).toNumber(), - 0 - ); - }); - - it("Scenario 8: User sends a valid transferring request", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let amount = 600000; - let balanceBefore = await bts_core.balanceOf( - holder.address, - _name - ); - await holder.setApprove(bts_core.address); - let tx = await holder.callTransfer(_name, amount, _to); - let balanceAfter = await bts_core.balanceOf( - holder.address, - _name - ); - let bts_core_balance = await bts_core.balanceOf( - bts_core.address, - _name - ); - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - - const transferEvents = await bts_periphery.getPastEvents( - "TransferStart", - {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, holder.address); - assert.equal(event._to, _to); - assert.equal(event._sn, 1); - assert.equal(event._assetDetails.length, 1); - assert.equal(event._assetDetails[0].coinName, _name); - assert.equal(event._assetDetails[0].value, amount - chargedFee); - assert.equal(event._assetDetails[0].fee, chargedFee); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 1); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - holder.address - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _name - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - amount - chargedFee - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - amount - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() - amount - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalance).toNumber(), - amount - ); - }); - - it("Scenario 9: BTSPeriphery receives a successful response of a recent request", async () => { - let amount = 600000; - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - let contract_balanceBefore = await bts_core.balanceOf( - holder.address, - _name - ); - let _msg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_OK, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 1, _msg); - let contract_balanceAfter = await bts_core.balanceOf( - holder.address, - _name - ); - let fees = await bts_core.getAccumulatedFees(); - let bts_core_balance = await bts_core.balanceOf( - bts_core.address, - _name - ); - - const transferEvents = await bts_periphery.getPastEvents( - "TransferEnd", - {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, holder.address); - assert.equal(event._sn, 1); - assert.equal(event._code, 0); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(contract_balanceBefore._lockedBalance).toNumber(), - amount - ); - assert.equal( - web3.utils.BN(contract_balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(contract_balanceBefore._usableBalance).toNumber(), - web3.utils.BN(contract_balanceAfter._usableBalance).toNumber() - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalance).toNumber(), - chargedFee - ); - assert.equal(fees[1].coinName, _name); - assert.equal(Number(fees[1].value), chargedFee); - }); - - it("Scenario 8: User sends a valid transferring request", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let amount = 100000000000000; - let balanceBefore = await bts_core.balanceOf( - holder.address, - _name - ); - let bts_core_balance_before = await bts_core.balanceOf( - bts_core.address, - _name - ); - await holder.setApprove(bts_core.address); - let tx = await holder.callTransfer(_name, amount, _to); - let balanceAfter = await bts_core.balanceOf( - holder.address, - _name - ); - let bts_core_balance_after = await bts_core.balanceOf( - bts_core.address, - _name - ); - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - - const transferEvents = await bts_periphery.getPastEvents( - "TransferStart", - {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, holder.address); - assert.equal(event._to, _to); - assert.equal(event._sn, 2); - assert.equal(event._assetDetails.length, 1); - assert.equal(event._assetDetails[0].coinName, _name); - assert.equal(event._assetDetails[0].value, amount - chargedFee); - assert.equal(event._assetDetails[0].fee, chargedFee); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 2); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - holder.address - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _name - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - amount - chargedFee - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - amount - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() - amount - ); - assert.equal( - web3.utils.BN(bts_core_balance_after._usableBalance).toNumber(), - web3.utils - .BN(bts_core_balance_before._usableBalance) - .toNumber() + amount - ); - }); - - it("Scenario 10: BTSPeriphery receives an error response of a recent request", async () => { - let amount = 100000000000000; - let chargedFee = Math.floor(amount / 1000) + _fixed_fee; - let balanceBefore = await bts_core.balanceOf( - holder.address, - _name - ); - let _msg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 2, _msg); - let balanceAfter = await bts_core.balanceOf( - holder.address, - _name - ); - - const transferEvents = await bts_periphery.getPastEvents( - "TransferEnd", - {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, holder.address); - assert.equal(event._sn, 2); - assert.equal(event._code, 1); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalance).toNumber(), - amount - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalance).toNumber(), - web3.utils.BN(balanceBefore._usableBalance).toNumber() + - amount - - chargedFee - ); - assert.equal( - web3.utils.BN(balanceAfter._refundableBalance).toNumber(), - 0 - ); - }); -}); - -contract("As a user, I want to receive PRA from ICON blockchain", (accounts) => { - let bmc, bts_periphery, bts_core, notpayable, refundable; - let service = "Coin/WrappedCoin"; - let _bmcICON = "btp://1234.iconee/0x1234567812345678"; - let _net = "1234.iconee"; - let _to = "btp://1234.iconee/0x12345678"; - let _native = "PARA"; - let _fee = 10; - let _fixed_fee = 500000; - let RC_ERR = 1; - let RC_OK = 0; - let _uri = "https://github.com/icon-project/icon-bridge"; - - before(async () => { - bts_periphery = await BTSPeriphery.new(); - bts_core = await BTSCore.new(); - bmc = await BMC.new("1234.pra"); - encode_msg = await EncodeMsg.new(); - await bts_periphery.initialize( - bmc.address, - bts_core.address, - service - ); - await bts_core.initialize(_native, _fee, _fixed_fee); - await bts_core.updateBTSPeriphery(bts_periphery.address); - notpayable = await NotPayable.new(); - refundable = await Refundable.new(); - await bmc.addService(service, bts_periphery.address); - await bmc.addVerifier(_net, accounts[1]); - await bmc.addLink(_bmcICON); - await bts_core.transferNativeCoin(_to, { - from: accounts[0], - value: 100000000, - }); - btpAddr = await bmc.bmcAddress(); - }); - - it("Scenario 1: Receiving address is invalid", async () => { - let _from = "0x12345678"; - let _value = 1000; - let _address = "0x1234567890123456789"; - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "InvalidAddress" - ); - let _msg = await encode_msg.encodeTransferMsgWithStringAddress( - _from, - _address, - _native, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - assert( - output.logs[0].args._next === _bmcICON && - output.logs[0].args._msg === _eventMsg - ); - }); - - it("Scenario 2: BTSCore has insufficient funds to transfer", async () => { - let _from = "0x12345678"; - let _value = 1000000000; - let balanceBefore = await bmc.getBalance(accounts[1]); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "TransferFailed" - ); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - accounts[1], - _native, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = await bmc.getBalance(accounts[1]); - - assert.equal( - web3.utils.BN(balanceAfter).toString(), - web3.utils.BN(balanceBefore).toString() - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it(`Scenario 3: BTSCore tries to transfer PARA coins to a non-payable contract, but it fails`, async () => { - let _from = "0x12345678"; - let _value = 1000; - let balanceBefore = await bmc.getBalance(notpayable.address); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "TransferFailed" - ); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - notpayable.address, - _native, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = await bmc.getBalance(notpayable.address); - - assert.equal( - web3.utils.BN(balanceAfter).toNumber(), - web3.utils.BN(balanceBefore).toNumber() - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 4: BTSPeriphery receives a request of transferring coins", async () => { - let _from = "0x12345678"; - let _value = 12345; - let balanceBefore = await bmc.getBalance(accounts[1]); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_OK, - "" - ); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - accounts[1], - _native, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = await bmc.getBalance(accounts[1]); - - assert.equal( - web3.utils.BN(balanceAfter).toString(), - web3.utils - .BN(balanceBefore) - .add(new web3.utils.BN(_value)) - .toString() - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it(`Scenario 5: BTSPeriphery receives a request of transferring coins`, async () => { - let _from = "0x12345678"; - let _value = 23456; - let balanceBefore = await bmc.getBalance(refundable.address); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_OK, - "" - ); - let _msg = await encode_msg.encodeTransferMsgWithStringAddress( - _from, - refundable.address, - _native, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = await bmc.getBalance(refundable.address); - - assert.equal( - web3.utils.BN(balanceAfter).toNumber(), - web3.utils.BN(balanceBefore).toNumber() + _value - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); -}); - -contract("As a user, I want to receive ERC1155_ICX from ICON blockchain", (accounts) => { - let bmc, bts_periphery, bts_core, holder, notpayable; - let service = "Coin/WrappedCoin"; - let _uri = "https://github.com/icon-project/icon-bridge"; - let _native = "PARA"; - let _fee = 10; - let _fixed_fee = 500000; - let _name = "ICON"; - let _bmcICON = "btp://1234.iconee/0x1234567812345678"; - let _net = "1234.iconee"; - let _from = "0x12345678"; - let RC_ERR = 1; - let RC_OK = 0; - - before(async () => { - bts_periphery = await BTSPeriphery.new(); - bts_core = await BTSCore.new(); - bmc = await BMC.new("1234.pra"); - encode_msg = await EncodeMsg.new(); - await bts_periphery.initialize( - bmc.address, - bts_core.address, - service - ); - await bts_core.initialize(_native, _fee, _fixed_fee); - await bts_core.updateBTSPeriphery(bts_periphery.address); - holder = await Holder.new(); - notpayable = await NotPayable.new(); - await bmc.addService(service, bts_periphery.address); - await bmc.addVerifier(_net, accounts[1]); - await bmc.addLink(_bmcICON); - await holder.addBSHContract( - bts_periphery.address, - bts_core.address - ); - await bts_core.register(_name, "", 18); - id = await bts_core.coinId(_name, "", 18); - btpAddr = await bmc.bmcAddress(); - }); - - it("Scenario 1: Receiving address is invalid", async () => { - let _value = 1000; - let _address = "0x1234567890123456789"; - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "InvalidAddress" - ); - let _msg = await encode_msg.encodeTransferMsgWithStringAddress( - _from, - _address, - _name, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it(`Scenario 2: Receiving contract does not implement ERC1155Holder / Receiver`, async () => { - let _value = 1000; - let balanceBefore = await bts_core.balanceOf( - notpayable.address, - id - ); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "TransferFailed" - ); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - notpayable.address, - _name, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = await bts_core.balanceOf(notpayable.address, id); - - assert.equal( - web3.utils.BN(balanceAfter).toNumber(), - web3.utils.BN(balanceBefore).toNumber() - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 3: BTSPeriphery receives a request of invalid token", async () => { - let _value = 3000; - let _tokenName = "Ethereum"; - let invalid_coin_id = await bts_core.coinId(_tokenName); - let balanceBefore = await bts_core.balanceOf( - holder.address, - invalid_coin_id - ); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "UnregisteredCoin" - ); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - holder.address, - _tokenName, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = await bts_core.balanceOf( - holder.address, - invalid_coin_id - ); - - assert.equal( - web3.utils.BN(balanceAfter).toNumber(), - web3.utils.BN(balanceBefore).toNumber() - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 4: Receiver is a ERC1155Holder contract", async () => { - let _value = 2500; - let balanceBefore = await bts_core.balanceOf(holder.address, id); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_OK, - "" - ); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - holder.address, - _name, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = await bts_core.balanceOf(holder.address, id); - - assert.equal( - web3.utils.BN(balanceAfter).toNumber(), - web3.utils.BN(balanceBefore).toNumber() + _value - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 5: Receiver is an account client", async () => { - let _value = 5500; - let balanceBefore = await bts_core.balanceOf(accounts[1], id); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_OK, - "" - ); - let _msg = await encode_msg.encodeTransferMsgWithAddress( - _from, - accounts[1], - _name, - _value - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balanceAfter = await bts_core.balanceOf(accounts[1], id); - - assert.equal( - web3.utils.BN(balanceAfter).toNumber(), - web3.utils.BN(balanceBefore).toNumber() + _value - ); - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); -}); - -contract("BSHs handle Gather Fee Service Requests", (accounts) => { - let bts_periphery, bts_core, bmc, holder; - let service = "Coin/WrappedCoin"; - let _uri = "https://github.com/icon-project/icon-bridge"; - let _native = "PARA"; - let _fee = 10; - let _fixed_fee = 500000; - let _name1 = "ICON"; - let _name2 = "BINANCE"; - let _name3 = "ETHEREUM"; - let _name4 = "TRON"; - let _net1 = "1234.iconee"; - let _net2 = "1234.binance"; - let _from1 = "0x12345678"; - let _from2 = "0x12345678"; - let _value1 = 999999999999999; - let _value2 = 999999999999999; - let _to1 = "btp://1234.iconee/0x12345678"; - let _to2 = "btp://1234.binance/0x12345678"; - let _txAmt = 1000000; - let _txAmt1 = 100000000; - let _txAmt2 = 5000000; - let RC_OK = 0; - let RC_ERR = 1; - let REPONSE_HANDLE_SERVICE = 2; - let _bmcICON = "btp://1234.iconee/0x1234567812345678"; - let _sn0 = 1; - let _sn1 = 2; - let _sn2 = 3; - - before(async () => { - bts_periphery = await MockBTSPeriphery.new(); - bts_core = await BTSCore.new(); - bmc = await BMC.new("1234.pra"); - encode_msg = await EncodeMsg.new(); - await bts_periphery.initialize(bmc.address, bts_core.address, service); - await bts_core.initialize(_native, _fee, _fixed_fee); - await bts_core.updateBTSPeriphery(bts_periphery.address); - holder = await Holder.new(); - btpAddr = await bmc.bmcAddress(); - await bmc.addService(service, bts_periphery.address); - await bmc.addVerifier(_net1, accounts[1]); - await bmc.addVerifier(_net2, accounts[2]); - await bmc.addLink(_bmcICON); - await holder.addBSHContract(bts_periphery.address, bts_core.address); - await bts_core.register(_name1, "", 18); - await bts_core.register(_name2, "", 18); - await bts_core.register(_name3, "", 18); - await bts_core.register(_name4, "", 18); - let _msg1 = await encode_msg.encodeTransferMsgWithAddress( - _from1, - holder.address, - _name1, - _value1 - ); - await bmc.receiveRequest(_bmcICON, "", service, _sn0, _msg1); - let _msg2 = await encode_msg.encodeTransferMsgWithAddress( - _from2, - holder.address, - _name2, - _value2 - ); - await bmc.receiveRequest(_bmcICON, "", service, _sn1, _msg2); - await bts_core.transferNativeCoin(_to1, { - from: accounts[0], - value: _txAmt, - }); - let _responseMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_OK, - "" - ); - await bmc.receiveResponse(_net1, service, _sn0, _responseMsg); - await holder.setApprove(bts_core.address); - await holder.callTransfer(_name1, _txAmt1, _to1); - await bmc.receiveResponse(_net1, service, _sn1, _responseMsg); - await holder.callTransfer(_name2, _txAmt2, _to2); - await bmc.receiveResponse(_net1, service, _sn2, _responseMsg); - }); - - it(`Scenario 1: Query 'Aggregation Fee'`, async () => { - let aggregationFee = await bts_core.getAccumulatedFees(); - - assert.equal(aggregationFee.length, 5); - assert.equal(aggregationFee[0].coinName, "PARA"); - assert.equal(aggregationFee[1].coinName, "ICON"); - assert.equal(aggregationFee[2].coinName, "BINANCE"); - assert.equal(aggregationFee[3].coinName, "ETHEREUM"); - assert.equal(aggregationFee[4].coinName, "TRON"); - - assert.equal( - Number(aggregationFee[0].value), - Math.floor(_txAmt / 1000) + _fixed_fee - ); - assert.equal( - Number(aggregationFee[1].value), - Math.floor(_txAmt1 / 1000) + _fixed_fee - ); - assert.equal( - Number(aggregationFee[2].value), - Math.floor(_txAmt2 / 1000) + _fixed_fee - ); - assert.equal(Number(aggregationFee[3].value), 0); - assert.equal(Number(aggregationFee[4].value), 0); - }); - - it("Scenario 2: Receiving a FeeGathering request not from BMCService", async () => { - let _sn3 = 3; - let FA1Before = await bts_periphery.getAggregationFeeOf(_native); // state Aggregation Fee of each type of Coins - let FA2Before = await bts_periphery.getAggregationFeeOf(_name1); - let FA3Before = await bts_periphery.getAggregationFeeOf(_name2); - await truffleAssert.reverts( - bts_periphery.handleFeeGathering.call(_to1, service, { - from: accounts[1], - }), - "Unauthorized" - ); - let FA1After = await bts_periphery.getAggregationFeeOf(_native); - let FA2After = await bts_periphery.getAggregationFeeOf(_name1); - let FA3After = await bts_periphery.getAggregationFeeOf(_name2); - let fees = await bts_periphery.getFees(_sn3); // get pending Aggregation Fee list - - assert.equal( - web3.utils.BN(FA1Before).toNumber(), - web3.utils.BN(FA1After).toNumber() - ); - assert.equal( - web3.utils.BN(FA2Before).toNumber(), - web3.utils.BN(FA2After).toNumber() - ); - assert.equal( - web3.utils.BN(FA3Before).toNumber(), - web3.utils.BN(FA3After).toNumber() - ); - assert.equal(fees.amounts.length, 0); - }); - - // Before: - // + state Aggregation Fee of each type of Coins are set - // + pendingAggregation Fee list is empty - // After: - // + all states of Aggregation Fee are push into pendingAggregation Fee list - // + state Aggregation Fee of each type of Coins are reset - it("Scenario 3: Handle GatherFee request from BMCService contract", async () => { - let _sn3 = 4; - let FA1Before = await bts_periphery.getAggregationFeeOf(_native); // state Aggregation Fee of each type of Coins - let FA2Before = await bts_periphery.getAggregationFeeOf(_name1); - let FA3Before = await bts_periphery.getAggregationFeeOf(_name2); - let _bmcService = await encode_msg.encodeBMCService(_to1, [service]); - let output = await bmc.receiveRequest( - _bmcICON, - "", - "bmc", - 100, - _bmcService - ); - let FA1After = await bts_periphery.getAggregationFeeOf(_native); - let FA2After = await bts_periphery.getAggregationFeeOf(_name1); - let FA3After = await bts_periphery.getAggregationFeeOf(_name2); - let fees = await bts_periphery.getFees(_sn3); // get pending Aggregation Fee list - let list = []; - for (let i = 0; i < fees.amounts.length; i++) { - list[i] = [fees.coinNames[i], fees.amounts[i]]; - } - let _eventMsg = await encode_msg.encodeTransferFeesBMCMessage( - btpAddr, - _bmcICON, - _to1, - service, - _sn3, - bts_core.address, - list - ); - - const transferEvents = await bts_periphery.getPastEvents( - "TransferStart", - { - fromBlock: output.receipt.blockNumber, - toBlock: "latest", - } - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, bts_core.address); - assert.equal(event._to, _to1); - assert.equal(event._sn, _sn3); - assert.equal(event._assetDetails.length, 3); - assert.equal(event._assetDetails[0].coinName, _native); - assert.equal(event._assetDetails[0].value, fees.amounts[0]); - assert.equal(event._assetDetails[0].fee, 0); - assert.equal(event._assetDetails[1].coinName, _name1); - assert.equal(event._assetDetails[1].value, fees.amounts[1]); - assert.equal(event._assetDetails[1].fee, 0); - assert.equal(event._assetDetails[2].coinName, _name2); - assert.equal(event._assetDetails[2].value, fees.amounts[2]); - assert.equal(event._assetDetails[2].fee, 0); - - assert.equal( - web3.utils.BN(FA1Before).toNumber(), - Math.floor(_txAmt / 1000) + _fixed_fee - ); - assert.equal( - web3.utils.BN(FA2Before).toNumber(), - Math.floor(_txAmt1 / 1000) + _fixed_fee - ); - assert.equal( - web3.utils.BN(FA3Before).toNumber(), - Math.floor(_txAmt2 / 1000) + _fixed_fee - ); - - assert.equal(web3.utils.BN(FA1After).toNumber(), 0); - assert.equal(web3.utils.BN(FA2After).toNumber(), 0); - assert.equal(web3.utils.BN(FA3After).toNumber(), 0); - - assert.equal(fees.coinNames[0], _native); - assert.equal(fees.coinNames[1], _name1); - assert.equal(fees.coinNames[2], _name2); - - assert.equal( - Number(fees.amounts[0]), - Math.floor(_txAmt / 1000) + _fixed_fee - ); - assert.equal( - Number(fees.amounts[1]), - Math.floor(_txAmt1 / 1000) + _fixed_fee - ); - assert.equal( - Number(fees.amounts[2]), - Math.floor(_txAmt2 / 1000) + _fixed_fee - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 4: Receiving a successful response", async () => { - let _sn3 = 4; - let feesBefore = await bts_periphery.getFees(_sn3); - let _responseMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_OK, - "" - ); - let tx = await bmc.receiveResponse(_net1, service, _sn3, _responseMsg); - let feesAfter = await bts_periphery.getFees(_sn3); - - const transferEvents = await bts_periphery.getPastEvents( - "TransferEnd", - { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, bts_core.address); - assert.equal(event._sn, _sn3); - assert.equal(event._code, 0); - assert.equal(event._response, ""); - - assert.equal(feesBefore.amounts.length, 3); - assert.equal(feesBefore.coinNames[0], _native); - assert.equal(feesBefore.coinNames[1], _name1); - assert.equal(feesBefore.coinNames[2], _name2); - assert.equal( - Number(feesBefore.amounts[0]), - Math.floor(_txAmt / 1000) + _fixed_fee - ); - assert.equal( - Number(feesBefore.amounts[1]), - Math.floor(_txAmt1 / 1000) + _fixed_fee - ); - assert.equal( - Number(feesBefore.amounts[2]), - Math.floor(_txAmt2 / 1000) + _fixed_fee - ); - assert.equal(feesAfter.amounts.length, 0); - }); - - it("Scenario 5: Receiving an error response", async () => { - let _sn4 = 5; - let _sn5 = 6; - let _sn6 = 7; - let _amt1 = 2000000; - let _amt2 = 6000000; - await holder.callTransfer(_name1, _amt1, _to1); - let _responseMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_OK, - "" - ); - await bmc.receiveResponse(_net1, service, _sn4, _responseMsg); - await holder.callTransfer(_name2, _amt2, _to2); - await bmc.receiveResponse(_net2, service, _sn5, _responseMsg); - let _bmcService = await encode_msg.encodeBMCService(_to1, [service]); - await bmc.receiveRequest(_bmcICON, "", "bmc", 100, _bmcService); - - let FA1Before = await bts_periphery.getAggregationFeeOf(_name1); - let FA2Before = await bts_periphery.getAggregationFeeOf(_name2); - let feesBefore = await bts_periphery.getFees(_sn6); - let _errMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net1, service, _sn6, _errMsg); - let FA1After = await bts_periphery.getAggregationFeeOf(_name1); - let FA2After = await bts_periphery.getAggregationFeeOf(_name2); - let feesAfter = await bts_periphery.getFees(_sn6); - - const transferEvents = await bts_periphery.getPastEvents( - "TransferEnd", - { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - } - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, bts_core.address); - assert.equal(event._sn, _sn6); - assert.equal(event._code, 1); - assert.equal(event._response, ""); - - assert.equal(feesBefore.amounts.length, 2); - assert.equal(feesBefore.coinNames[0], _name1); - assert.equal(feesBefore.coinNames[1], _name2); - assert.equal( - Number(feesBefore.amounts[0]), - Math.floor(_amt1 / 1000) + _fixed_fee - ); - assert.equal( - Number(feesBefore.amounts[1]), - Math.floor(_amt2 / 1000) + _fixed_fee - ); - - assert.equal(web3.utils.BN(FA1Before).toNumber(), 0); - assert.equal(web3.utils.BN(FA2Before).toNumber(), 0); - assert.equal(feesAfter.amounts.length, 0); - assert.equal( - web3.utils.BN(FA1After).toNumber(), - Math.floor(_amt1 / 1000) + _fixed_fee - ); - assert.equal( - web3.utils.BN(FA2After).toNumber(), - Math.floor(_amt2 / 1000) + _fixed_fee + web3.utils.BN(balanceAfter).toNumber(), + web3.utils.BN(balanceBefore).toNumber() + _value ); + assert.equal(output.logs[0].args._next, _bmcICON); + assert.equal(output.logs[0].args._msg, _eventMsg); }); }); - -contract("As a user, I want to receive multiple Coins/Tokens from ICON blockchain", (accounts) => { - let bts_periphery, bts_core, bmc, holder, refundable; - let service = "Coin/WrappedCoin"; - let _uri = "https://github.com/icon-project/icon-bridge"; - let _native = "PARA"; - let _fee = 10; - let _fixed_fee = 500000; - let _name1 = "ICON"; - let _name2 = "BINANCE"; - let _name3 = "ETHEREUM"; - let _name4 = "TRON"; - let _net1 = "1234.iconee"; - let _bmcICON = "btp://1234.iconee/0x1234567812345678"; - let RC_OK = 0; - let RC_ERR = 1; - let _from1 = "0x12345678"; - let _to = "btp://1234.iconee/0x12345678"; - - before(async () => { - bts_periphery = await BTSPeriphery.new(); - bts_core = await BTSCore.new(); - bmc = await BMC.new("1234.pra"); - encode_msg = await EncodeMsg.new(); - await bts_periphery.initialize( - bmc.address, - bts_core.address, - service - ); - await bts_core.initialize(_native, _fee, _fixed_fee); - await bts_core.updateBTSPeriphery(bts_periphery.address); - holder = await Holder.new(); - refundable = await Refundable.new(); - btpAddr = await bmc.bmcAddress(); - await bmc.addService(service, bts_periphery.address); - await bmc.addVerifier(_net1, accounts[1]); - await bmc.addLink(_bmcICON); - await holder.addBSHContract( - bts_periphery.address, - bts_core.address - ); - await bts_core.register(_name1, "", 18); - await bts_core.register(_name2, "", 18); - await bts_core.register(_name3, "", 18); - await bts_core.register(_name4, "", 18); - await bts_core.transferNativeCoin(_to, { - from: accounts[0], - value: 10000000, - }); - }); - - it("Scenario 1: Receiving address is invalid", async () => { - let _value1 = 1000; - let _value2 = 10000; - let _value3 = 40000; - let _address = "0x1234567890123456789"; - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "InvalidAddress" - ); - let _msg = await encode_msg.encodeBatchTransferMsgWithStringAddress( - _from1, - _address, - [ - [_native, _value1], - [_name1, _value2], - [_name2, _value3], - ] - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 2: BSHPerphery receives a request of invalid token", async () => { - let _value1 = 1000; - let _value2 = 10000; - let _value3 = 40000; - let _invalid_token = "EOS"; - let balance1Before = await bts_core.balanceOf( - holder.address, - _name1 - ); - let balance2Before = await bts_core.balanceOf( - holder.address, - _name2 - ); - let balance3Before = await bts_core.balanceOf( - holder.address, - _invalid_token - ); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "UnregisteredCoin" - ); - let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( - _from1, - holder.address, - [ - [_name1, _value1], - [_name2, _value2], - [_invalid_token, _value3], - ] - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balance1After = await bts_core.balanceOf( - holder.address, - _name1 - ); - let balance2After = await bts_core.balanceOf( - holder.address, - _name2 - ); - let balance3After = await bts_core.balanceOf( - holder.address, - _invalid_token - ); - - assert.equal( - web3.utils.BN(balance1Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance3Before._usableBalance).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balance1After._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2After._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance3After._usableBalance).toNumber(), - 0 - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 3: One of requests is failed in TransferBatch", async () => { - let _value1 = 1000; - let _value2 = 10000; - let _value3 = 20000000; - let balance1Before = await bts_core.balanceOf( - accounts[1], - _name1 - ); - let balance2Before = await bts_core.balanceOf( - accounts[1], - _name2 - ); - let balance3Before = await bts_core.balanceOf( - accounts[1], - _native - ); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "TransferFailed" - ); - let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( - _from1, - accounts[1], - [ - [_name1, _value1], - [_name2, _value2], - [_native, _value3], - ] - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balance1After = await bts_core.balanceOf( - accounts[1], - _name1 - ); - let balance2After = await bts_core.balanceOf( - accounts[1], - _name2 - ); - let balance3After = await bts_core.balanceOf( - accounts[1], - _native - ); - - assert.equal( - web3.utils.BN(balance1Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2Before._usableBalance).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balance1After._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2After._usableBalance).toNumber(), - 0 - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 4: One of requests is failed in TransferBatch", async () => { - let _value1 = 1000; - let _value2 = 10000; - let _value3 = 40000; - let balance1Before = await bts_core.balanceOf( - refundable.address, - _native - ); - let balance2Before = await bts_core.balanceOf( - refundable.address, - _name1 - ); - let balance3Before = await bts_core.balanceOf( - refundable.address, - _name2 - ); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "TransferFailed" - ); - let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( - _from1, - refundable.address, - [ - [_native, _value1], - [_name1, _value2], - [_name2, _value3], - ] - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balance1After = await bts_core.balanceOf( - refundable.address, - _native - ); - let balance2After = await bts_core.balanceOf( - refundable.address, - _name1 - ); - let balance3After = await bts_core.balanceOf( - refundable.address, - _name2 - ); - - assert.equal( - web3.utils.BN(balance1Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance3Before._usableBalance).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balance1After._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2After._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance3After._usableBalance).toNumber(), - 0 - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 5: One of requests is failed in TransferBatch", async () => { - let _value1 = 1000; - let _value2 = 10000; - let _value3 = 40000; - let balance1Before = await bts_core.balanceOf( - holder.address, - _name1 - ); - let balance2Before = await bts_core.balanceOf( - holder.address, - _name2 - ); - let balance3Before = await bts_core.balanceOf( - holder.address, - _native - ); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_ERR, - "TransferFailed" - ); - let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( - _from1, - holder.address, - [ - [_name1, _value1], - [_name2, _value2], - [_native, _value3], - ] - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balance1After = await bts_core.balanceOf( - holder.address, - _name1 - ); - let balance2After = await bts_core.balanceOf( - holder.address, - _name2 - ); - let balance3After = await bts_core.balanceOf( - holder.address, - _native - ); - - assert.equal( - web3.utils.BN(balance1Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance3Before._usableBalance).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balance1After._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2After._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance3After._usableBalance).toNumber(), - 0 - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 6: Receiving a successful TransferBatch request", async () => { - let _value1 = 1000; - let _value2 = 10000; - let _value3 = 40000; - let balance1Before = await bts_core.balanceOf( - holder.address, - _name1 - ); - let balance2Before = await bts_core.balanceOf( - holder.address, - _name2 - ); - let balance3Before = await bts_core.balanceOf( - holder.address, - _name3 - ); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_OK, - "" - ); - let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( - _from1, - holder.address, - [ - [_name1, _value1], - [_name2, _value2], - [_name3, _value3], - ] - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balance1After = await bts_core.balanceOf( - holder.address, - _name1 - ); - let balance2After = await bts_core.balanceOf( - holder.address, - _name2 - ); - let balance3After = await bts_core.balanceOf( - holder.address, - _name3 - ); - - assert.equal( - web3.utils.BN(balance1Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance2Before._usableBalance).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balance3Before._usableBalance).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balance1After._usableBalance).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balance2After._usableBalance).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balance3After._usableBalance).toNumber(), - _value3 - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - - it("Scenario 7: Receiving a successful TransferBatch request", async () => { - let _value1 = 1000; - let _value2 = 10000; - let _value3 = 40000; - let balance1Before = await bts_core.balanceOf( - accounts[1], - _native - ); - let balance2Before = await bts_core.balanceOf( - accounts[1], - _name2 - ); - let balance3Before = await bts_core.balanceOf( - accounts[1], - _name3 - ); - let _eventMsg = await encode_msg.encodeResponseBMCMessage( - btpAddr, - _bmcICON, - service, - 10, - RC_OK, - "" - ); - let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( - _from1, - accounts[1], - [ - [_native, _value1], - [_name2, _value2], - [_name3, _value3], - ] - ); - let output = await bmc.receiveRequest( - _bmcICON, - "", - service, - 10, - _msg - ); - let balance1After = await bts_core.balanceOf( - accounts[1], - _native - ); - let balance2After = await bts_core.balanceOf( - accounts[1], - _name2 - ); - let balance3After = await bts_core.balanceOf( - accounts[1], - _name3 - ); - - assert.equal( - web3.utils.BN(balance1After._usableBalance).toString(), - web3.utils - .BN(balance1Before._usableBalance) - .add(new web3.utils.BN(_value1)) - .toString() - ); - assert.equal( - web3.utils.BN(balance2After._usableBalance).toNumber(), - web3.utils.BN(balance2Before._usableBalance).toNumber() + - _value2 - ); - assert.equal( - web3.utils.BN(balance3After._usableBalance).toNumber(), - web3.utils.BN(balance3Before._usableBalance).toNumber() + - _value3 - ); - - assert.equal(output.logs[0].args._next, _bmcICON); - assert.equal(output.logs[0].args._msg, _eventMsg); - }); - } -); - -contract("As a user, I want to send multiple coins/tokens to ICON blockchain", (accounts) => { - let bts_periphery, bts_core, bmc, holder; - let service = "Coin/WrappedCoin"; - let _uri = "https://github.com/icon-project/icon-bridge"; - let _native = "PARA"; - let _fee = 10; - let _fixed_fee = 500000; - let _net = "1234.iconee"; - let _from = "0x12345678"; - let _value = 999999999999999; - let REPONSE_HANDLE_SERVICE = 2; - let RC_OK = 0; - let RC_ERR = 1; - let _bmcICON = "btp://1234.iconee/0x1234567812345678"; - let _coin1 = "ICON"; - let _coin2 = "TRON"; - let _coin3 = "BINANCE"; - let initAmt = 1000000000000000; - - before(async () => { - bts_periphery = await BTSPeriphery.new(); - bts_core = await BTSCore.new(); - bmc = await BMC.new("1234.pra"); - encode_msg = await EncodeMsg.new(); - await bts_periphery.initialize( - bmc.address, - bts_core.address, - service - ); - await bts_core.initialize(_native, _fee, _fixed_fee); - await bts_core.updateBTSPeriphery(bts_periphery.address); - holder = await Holder.new(); - await bmc.addService(service, bts_periphery.address); - await bmc.addVerifier(_net, accounts[1]); - await bmc.addLink(_bmcICON); - await holder.addBSHContract( - bts_periphery.address, - bts_core.address - ); - await bts_core.register(_coin1, "", 18); - await bts_core.register(_coin2, "", 18); - await bts_core.register(_coin3, "", 18); - await bts_core.transferNativeCoin("btp://1234.iconee/0x12345678", { - from: accounts[0], - value: initAmt, - }); - await holder.deposit({from: accounts[1], value: 100000000000000}); - let _msg1 = await encode_msg.encodeTransferMsgWithAddress( - _from, - holder.address, - _coin1, - _value - ); - await bmc.receiveRequest(_bmcICON, "", service, 0, _msg1); - let _msg2 = await encode_msg.encodeTransferMsgWithAddress( - _from, - holder.address, - _coin2, - _value - ); - await bmc.receiveRequest(_bmcICON, "", service, 1, _msg2); - let _msg3 = await encode_msg.encodeTransferMsgWithAddress( - _from, - holder.address, - _coin3, - _value - ); - await bmc.receiveRequest(_bmcICON, "", service, 2, _msg3); - - _msg1 = await encode_msg.encodeTransferMsgWithAddress( - _from, - accounts[1], - _coin1, - _value - ); - await bmc.receiveRequest(_bmcICON, "", service, 0, _msg1); - _msg2 = await encode_msg.encodeTransferMsgWithAddress( - _from, - accounts[1], - _coin2, - _value - ); - await bmc.receiveRequest(_bmcICON, "", service, 1, _msg2); - _msg3 = await encode_msg.encodeTransferMsgWithAddress( - _from, - accounts[1], - _coin3, - _value - ); - await bmc.receiveRequest(_bmcICON, "", service, 2, _msg3); - }); - - it("Scenario 1: User has not yet set approval for token being transferred out by Operator", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _coins = [_coin1, _coin2]; - let _values = [600000, 700000]; - let _native_amt = 800000; - let _query = [_native, _coin1, _coin2]; - let balanceBefore = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_core.address, - _coins, - _values, - _to, - _native_amt - ), - "revert" - ); - let balanceAfter = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _query - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it(`Scenario 2: User has set approval, but user's balance has insufficient amount`, async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _coins = [_coin1, _coin2]; - let _values = [600000, 9999999999999999n]; - let _native_amt = 700000; - let _query = [_native, _coin1, _coin2]; - let balanceBefore = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - await holder.setApprove(bts_core.address); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_core.address, - _coins, - _values, - _to, - _native_amt - ), - "revert" - ); - let balanceAfter = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _query - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it("Scenario 3: User requests to transfer an invalid Token", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let invalid_token = "EOS"; - let _coins = [_coin1, invalid_token]; - let _values = [600000, 700000]; - let _native_amt = 800000; - let _query = [_native, _coin1, invalid_token]; - let balanceBefore = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - await holder.setApprove(bts_core.address); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_core.address, - _coins, - _values, - _to, - _native_amt - ), - "revert" - ); - let balanceAfter = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _query - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it("Scenario 4: User transfers Tokens to an invalid BTP Address format", async () => { - let _to = "1234.iconee/0x12345678"; - let _coins = [_coin1, _coin2]; - let _values = [600000, 700000]; - let _query = [_native, _coin1, _coin2]; - let _native_amt = 800000; - let balanceBefore = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - await holder.setApprove(bts_core.address); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_core.address, - _coins, - _values, - _to, - _native_amt - ), - "revert" - ); - let balanceAfter = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _query - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it("Scenario 5: User requests to transfer zero Token", async () => { - let _to = "1234.iconee/0x12345678"; - let _coins = [_coin1, _coin2]; - let _values = [600000, 0]; - let _query = [_native, _coin1, _coin2]; - let _native_amt = 800000; - let balanceBefore = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - await holder.setApprove(bts_core.address); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_core.address, - _coins, - _values, - _to, - _native_amt - ), - "revert" - ); - let balanceAfter = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _query - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it("Scenario 6: Transffering amount is less than fixed fee", async () => { - let _to = "1234.iconee/0x12345678"; - let _coins = [_coin1, _coin2]; - let _values = [600000, 300000]; - let _query = [_native, _coin1, _coin2]; - let _native_amt = 800000; - let balanceBefore = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - await holder.setApprove(bts_core.address); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_core.address, - _coins, - _values, - _to, - _native_amt - ), - "revert" - ); - let balanceAfter = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _query - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it("Scenario 7: User requests to transfer to an invalid network/Not Supported Network", async () => { - let _to = "btp://1234.eos/0x12345678"; - let _coins = [_coin1, _coin2]; - let _values = [600000, 700000]; - let _query = [_native, _coin1, _coin2]; - let _native_amt = 1000; - let balanceBefore = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - await holder.setApprove(bts_core.address); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_core.address, - _coins, - _values, - _to, - _native_amt - ), - "revert" - ); - let balanceAfter = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _query - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it("Scenario 8: Account client sends an invalid request of transferBatch", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _coins = [_native, _native, _native]; - let _values = [600000, 600000, 600000]; - let balanceBefore = await bts_core.getBalanceOfBatch( - accounts[2], - _coins - ); - await truffleAssert.reverts( - bts_core.transferBatch.call(_coins, _values, _to, { - from: accounts[2], - value: 600000, - }), - "revert" - ); - let balanceAfter = await bts_core.getBalanceOfBatch( - accounts[2], - _coins - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _coins - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - initAmt - ); - }); - - it("Scenario 9: Contract client sends an invalid request of transferBatch", async () => { - let _to = "btp://1234.eos/0x12345678"; - let _coins = [_native, _coin1, _coin2]; - let _values = [600000, 700000]; - let balanceBefore = await bts_core.getBalanceOfBatch( - holder.address, - _coins - ); - await holder.setApprove(bts_core.address); - await truffleAssert.reverts( - holder.callTransferBatch.call( - bts_core.address, - _coins, - _values, - _to, - 0 - ), - "revert" - ); - let balanceAfter = await bts_core.getBalanceOfBatch( - holder.address, - _coins - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _coins - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 0 - ); - }); - - it("Scenario 10: Contract client sends a valid transferBatch request", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _coins = [_coin1, _coin2]; - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _values = [_value2, _value3]; - let _query = [_native, _coin1, _coin2]; - let balanceBefore = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - await holder.setApprove(bts_core.address); - let tx = await holder.callTransferBatch( - bts_core.address, - _coins, - _values, - _to, - _value1 - ); - let balanceAfter = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _query - ); - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_periphery.getPastEvents( - "TransferStart", - {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, holder.address); - assert.equal(event._to, _to); - assert.equal(event._sn, 2); - assert.equal(event._assetDetails.length, 3); - assert.equal(event._assetDetails[0].coinName, _coin1); - assert.equal(event._assetDetails[0].value, _value2 - chargedFee2); - assert.equal(event._assetDetails[0].fee, chargedFee2); - assert.equal(event._assetDetails[1].coinName, _coin2); - assert.equal(event._assetDetails[1].value, _value3 - chargedFee3); - assert.equal(event._assetDetails[1].fee, chargedFee3); - assert.equal(event._assetDetails[2].coinName, _native); - assert.equal(event._assetDetails[2].value, _value1 - chargedFee1); - assert.equal(event._assetDetails[2].fee, chargedFee1); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 2); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - holder.address - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _coin1 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - _value2 - chargedFee2 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), - _coin2 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), - _value3 - chargedFee3 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), - _native - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), - _value1 - chargedFee1 - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - - _value3 - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt + _value1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - _value3 - ); - }); - - it("Scenario 11: BTSPeriphery receives a successful response of a recent request", async () => { - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _coins = [_native, _coin1, _coin2]; - let balanceBefore = await bts_core.getBalanceOfBatch( - holder.address, - _coins - ); - let _responseMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_OK, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 2, _responseMsg); - let balanceAfter = await bts_core.getBalanceOfBatch( - holder.address, - _coins - ); - let fees = await bts_core.getAccumulatedFees(); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _coins - ); - - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_periphery.getPastEvents( - "TransferEnd", - {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, holder.address); - assert.equal(event._sn, 2); - assert.equal(event._code, 0); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - ); - - assert.equal(fees[0].coinName, _native); - assert.equal(Number(fees[0].value), chargedFee1); - assert.equal(fees[1].coinName, _coin1); - assert.equal(Number(fees[1].value), chargedFee2); - assert.equal(fees[2].coinName, _coin2); - assert.equal(Number(fees[2].value), chargedFee3); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt + _value1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - chargedFee2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - chargedFee3 - ); - }); - - it("Scenario 12: Account client sends a valid transferBatch request", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _coins = [_coin3, _coin1, _coin2]; - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _values = [_value1, _value2, _value3]; - let balanceBefore = await bts_core.getBalanceOfBatch( - accounts[1], - _coins - ); - await bts_core.setApprovalForAll(bts_core.address, true, { - from: accounts[1], - }); - let tx = await bts_core.transferBatch(_coins, _values, _to, { - from: accounts[1], - }); - let balanceAfter = await bts_core.getBalanceOfBatch( - accounts[1], - _coins - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _coins - ); - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_periphery.getPastEvents( - "TransferStart", - {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, accounts[1]); - assert.equal(event._to, _to); - assert.equal(event._sn, 3); - assert.equal(event._assetDetails.length, 3); - assert.equal(event._assetDetails[0].coinName, _coin3); - assert.equal(event._assetDetails[0].value, _value1 - chargedFee1); - assert.equal(event._assetDetails[0].fee, chargedFee1); - assert.equal(event._assetDetails[1].coinName, _coin1); - assert.equal(event._assetDetails[1].value, _value2 - chargedFee2); - assert.equal(event._assetDetails[1].fee, chargedFee2); - assert.equal(event._assetDetails[2].coinName, _coin2); - assert.equal(event._assetDetails[2].value, _value3 - chargedFee3); - assert.equal(event._assetDetails[2].fee, chargedFee3); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 3); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - accounts[1] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _coin3 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - _value1 - chargedFee1 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), - _coin1 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), - _value2 - chargedFee2 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), - _coin2 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), - _value3 - chargedFee3 - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - - _value3 - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - _value2 + chargedFee2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - _value3 + chargedFee3 - ); - }); - - it("Scenario 13: BTSPeriphery receives an error response of a recent request", async () => { - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _coins = [_coin3, _coin1, _coin2]; - let balanceBefore = await bts_core.getBalanceOfBatch( - accounts[1], - _coins - ); - let _responseMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 3, _responseMsg); - let balanceAfter = await bts_core.getBalanceOfBatch( - accounts[1], - _coins - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _coins - ); - - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_periphery.getPastEvents( - "TransferEnd", - {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, accounts[1]); - assert.equal(event._sn, 3); - assert.equal(event._code, 1); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() + - _value1 - - chargedFee1 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() + - _value2 - - chargedFee2 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() + - _value3 - - chargedFee3 - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - chargedFee1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 2 * chargedFee2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 2 * chargedFee3 - ); - }); - - it("Scenario 14: Contract client sends a valid transferBatch request", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _coins = [_coin3, _coin1, _coin2]; - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _values = [_value1, _value2, _value3]; - let balanceBefore = await bts_core.getBalanceOfBatch( - holder.address, - _coins - ); - await holder.setApprove(bts_core.address); - let tx = await holder.callTransferBatch( - bts_core.address, - _coins, - _values, - _to, - 0 - ); - let balanceAfter = await bts_core.getBalanceOfBatch( - holder.address, - _coins - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _coins - ); - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_periphery.getPastEvents( - "TransferStart", - {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, holder.address); - assert.equal(event._to, _to); - assert.equal(event._sn, 4); - assert.equal(event._assetDetails.length, 3); - assert.equal(event._assetDetails[0].coinName, _coin3); - assert.equal(event._assetDetails[0].value, _value1 - chargedFee1); - assert.equal(event._assetDetails[0].fee, chargedFee1); - assert.equal(event._assetDetails[1].coinName, _coin1); - assert.equal(event._assetDetails[1].value, _value2 - chargedFee2); - assert.equal(event._assetDetails[1].fee, chargedFee2); - assert.equal(event._assetDetails[2].coinName, _coin2); - assert.equal(event._assetDetails[2].value, _value3 - chargedFee3); - assert.equal(event._assetDetails[2].fee, chargedFee3); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 4); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - holder.address - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _coin3 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - _value1 - chargedFee1 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), - _coin1 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), - _value2 - chargedFee2 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), - _coin2 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), - _value3 - chargedFee3 - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - - _value3 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - _value1 + chargedFee1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - _value2 + 2 * chargedFee2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - _value3 + 2 * chargedFee3 - ); - }); - - it("Scenario 15: BTSPeriphery receives an error response of a recent request", async () => { - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _coins = [_coin3, _coin1, _coin2]; - let balanceBefore = await bts_core.getBalanceOfBatch( - holder.address, - _coins - ); - let _responseMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 4, _responseMsg); - let balanceAfter = await bts_core.getBalanceOfBatch( - holder.address, - _coins - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _coins - ); - - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_periphery.getPastEvents( - "TransferEnd", - {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, holder.address); - assert.equal(event._sn, 4); - assert.equal(event._code, 1); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() + - _value1 - - chargedFee1 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() + - _value2 - - chargedFee2 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() + - _value3 - - chargedFee3 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - 2 * chargedFee1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 3 * chargedFee2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 3 * chargedFee3 - ); - }); - - // This test is replicated from Scenario 10 - it("Scenario 16: Contract client sends a valid transferBatch request", async () => { - let _to = "btp://1234.iconee/0x12345678"; - let _coins = [_coin1, _coin2]; - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _values = [_value2, _value3]; - let _query = [_native, _coin1, _coin2]; - let balanceBefore = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - await holder.setApprove(bts_core.address); - let tx = await holder.callTransferBatch( - bts_core.address, - _coins, - _values, - _to, - _value1 - ); - let balanceAfter = await bts_core.getBalanceOfBatch( - holder.address, - _query - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _query - ); - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_periphery.getPastEvents( - "TransferStart", - {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} - ); - let event = transferEvents[0].returnValues; - assert.equal(event._from, holder.address); - assert.equal(event._to, _to); - assert.equal(event._sn, 5); - assert.equal(event._assetDetails.length, 3); - assert.equal(event._assetDetails[0].coinName, _coin1); - assert.equal(event._assetDetails[0].value, _value2 - chargedFee2); - assert.equal(event._assetDetails[0].fee, chargedFee2); - assert.equal(event._assetDetails[1].coinName, _coin2); - assert.equal(event._assetDetails[1].value, _value3 - chargedFee3); - assert.equal(event._assetDetails[1].fee, chargedFee3); - assert.equal(event._assetDetails[2].coinName, _native); - assert.equal(event._assetDetails[2].value, _value1 - chargedFee1); - assert.equal(event._assetDetails[2].fee, chargedFee1); - - const linkStatus = await bmc.getStatus(_bmcICON); - const bmcBtpAddress = await bmc.getBmcBtpAddress(); - - const messageEvents = await bmc.getPastEvents("Message", { - fromBlock: tx.receipt.blockNumber, - toBlock: "latest", - }); - event = messageEvents[0].returnValues; - assert.equal(event._next, _bmcICON); - assert.equal(event._seq, linkStatus.txSeq); - - const bmcMsg = rlp.decode(event._msg); - - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); - assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); - assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 5); - - const ServiceMsg = rlp.decode(bmcMsg[4]); - assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); - - const coinTransferMsg = rlp.decode(ServiceMsg[1]); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), - holder.address - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), - _to.split("/").slice(-1)[0] - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), - _coin1 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), - _value2 - chargedFee2 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), - _coin2 - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), - _value3 - chargedFee3 - ); - assert.equal( - web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), - _native - ); - assert.equal( - web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), - _value1 - chargedFee1 - ); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - - _value1 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - - _value2 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - - _value3 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt + 2 * _value1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - _value2 + 3 * chargedFee2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - _value3 + 3 * chargedFee3 - ); - }); - - it("Scenario 17: BTSPeriphery receives an error response of a recent request", async () => { - let _value1 = 600000; - let _value2 = 700000; - let _value3 = 800000; - let _coins = [_native, _coin1, _coin2]; - let balanceBefore = await bts_core.getBalanceOfBatch( - holder.address, - _coins - ); - let _responseMsg = await encode_msg.encodeResponseMsg( - REPONSE_HANDLE_SERVICE, - RC_ERR, - "" - ); - let tx = await bmc.receiveResponse(_net, service, 5, _responseMsg); - let balanceAfter = await bts_core.getBalanceOfBatch( - holder.address, - _coins - ); - let bts_core_balance = await bts_core.getBalanceOfBatch( - bts_core.address, - _coins - ); - let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; - let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; - let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; - - const transferEvents = await bts_periphery.getPastEvents( - "TransferEnd", - {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} - ); - let event = transferEvents[0].returnValues; - - assert.equal(event._from, holder.address); - assert.equal(event._sn, 5); - assert.equal(event._code, 1); - assert.equal(event._response, ""); - - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), - _value1 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), - _value2 - ); - assert.equal( - web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), - _value3 - ); - - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), - 0 - ); - - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() + - _value2 - - chargedFee2 - ); - assert.equal( - web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), - web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() + - _value3 - - chargedFee3 - ); - assert.equal( - web3.utils.BN(balanceBefore._refundableBalances[0]).toNumber(), - 0 - ); - assert.equal( - web3.utils.BN(balanceAfter._refundableBalances[0]).toNumber(), - _value1 - chargedFee1 - ); - - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), - initAmt + 2 * _value1 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), - 4 * chargedFee2 - ); - assert.equal( - web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), - 4 * chargedFee3 - ); - }); - } -); +// +// contract("As a user, I want to receive ERC1155_ICX from ICON blockchain", (accounts) => { +// let bmc, bts_periphery, bts_core, holder, notpayable; +// let service = "Coin/WrappedCoin"; +// let _uri = "https://github.com/icon-project/icon-bridge"; +// let _native = "PARA"; +// let _fee = 10; +// let _fixed_fee = 500000; +// let _name = "ICON"; +// let _bmcICON = "btp://1234.iconee/0x1234567812345678"; +// let _net = "1234.iconee"; +// let _from = "0x12345678"; +// let RC_ERR = 1; +// let RC_OK = 0; +// +// before(async () => { +// bts_periphery = await BTSPeriphery.new(); +// bts_core = await BTSCore.new(); +// bmc = await BMC.new("1234.pra"); +// encode_msg = await EncodeMsg.new(); +// await bts_periphery.initialize( +// bmc.address, +// bts_core.address, +// service +// ); +// await bts_core.initialize(_native, _fee, _fixed_fee); +// await bts_core.updateBTSPeriphery(bts_periphery.address); +// holder = await Holder.new(); +// notpayable = await NotPayable.new(); +// await bmc.addService(service, bts_periphery.address); +// await bmc.addVerifier(_net, accounts[1]); +// await bmc.addLink(_bmcICON); +// await holder.addBSHContract( +// bts_periphery.address, +// bts_core.address +// ); +// await bts_core.register(_name, "", 18); +// id = await bts_core.coinId(_name, "", 18); +// btpAddr = await bmc.bmcAddress(); +// }); +// +// it("Scenario 1: Receiving address is invalid", async () => { +// let _value = 1000; +// let _address = "0x1234567890123456789"; +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "InvalidAddress" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithStringAddress( +// _from, +// _address, +// _name, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it(`Scenario 2: Receiving contract does not implement ERC1155Holder / Receiver`, async () => { +// let _value = 1000; +// let balanceBefore = await bts_core.balanceOf( +// notpayable.address, +// id +// ); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "TransferFailed" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// notpayable.address, +// _name, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balanceAfter = await bts_core.balanceOf(notpayable.address, id); +// +// assert.equal( +// web3.utils.BN(balanceAfter).toNumber(), +// web3.utils.BN(balanceBefore).toNumber() +// ); +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 3: BTSPeriphery receives a request of invalid token", async () => { +// let _value = 3000; +// let _tokenName = "Ethereum"; +// let invalid_coin_id = await bts_core.coinId(_tokenName); +// let balanceBefore = await bts_core.balanceOf( +// holder.address, +// invalid_coin_id +// ); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "UnregisteredCoin" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// holder.address, +// _tokenName, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balanceAfter = await bts_core.balanceOf( +// holder.address, +// invalid_coin_id +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter).toNumber(), +// web3.utils.BN(balanceBefore).toNumber() +// ); +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 4: Receiver is a ERC1155Holder contract", async () => { +// let _value = 2500; +// let balanceBefore = await bts_core.balanceOf(holder.address, id); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_OK, +// "" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// holder.address, +// _name, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balanceAfter = await bts_core.balanceOf(holder.address, id); +// +// assert.equal( +// web3.utils.BN(balanceAfter).toNumber(), +// web3.utils.BN(balanceBefore).toNumber() + _value +// ); +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 5: Receiver is an account client", async () => { +// let _value = 5500; +// let balanceBefore = await bts_core.balanceOf(accounts[1], id); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_OK, +// "" +// ); +// let _msg = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// accounts[1], +// _name, +// _value +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balanceAfter = await bts_core.balanceOf(accounts[1], id); +// +// assert.equal( +// web3.utils.BN(balanceAfter).toNumber(), +// web3.utils.BN(balanceBefore).toNumber() + _value +// ); +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// }); +// +// contract("BSHs handle Gather Fee Service Requests", (accounts) => { +// let bts_periphery, bts_core, bmc, holder; +// let service = "Coin/WrappedCoin"; +// let _uri = "https://github.com/icon-project/icon-bridge"; +// let _native = "PARA"; +// let _fee = 10; +// let _fixed_fee = 500000; +// let _name1 = "ICON"; +// let _name2 = "BINANCE"; +// let _name3 = "ETHEREUM"; +// let _name4 = "TRON"; +// let _net1 = "1234.iconee"; +// let _net2 = "1234.binance"; +// let _from1 = "0x12345678"; +// let _from2 = "0x12345678"; +// let _value1 = 999999999999999; +// let _value2 = 999999999999999; +// let _to1 = "btp://1234.iconee/0x12345678"; +// let _to2 = "btp://1234.binance/0x12345678"; +// let _txAmt = 1000000; +// let _txAmt1 = 100000000; +// let _txAmt2 = 5000000; +// let RC_OK = 0; +// let RC_ERR = 1; +// let REPONSE_HANDLE_SERVICE = 2; +// let _bmcICON = "btp://1234.iconee/0x1234567812345678"; +// let _sn0 = 1; +// let _sn1 = 2; +// let _sn2 = 3; +// +// before(async () => { +// bts_periphery = await MockBTSPeriphery.new(); +// bts_core = await BTSCore.new(); +// bmc = await BMC.new("1234.pra"); +// encode_msg = await EncodeMsg.new(); +// await bts_periphery.initialize(bmc.address, bts_core.address, service); +// await bts_core.initialize(_native, _fee, _fixed_fee); +// await bts_core.updateBTSPeriphery(bts_periphery.address); +// holder = await Holder.new(); +// btpAddr = await bmc.bmcAddress(); +// await bmc.addService(service, bts_periphery.address); +// await bmc.addVerifier(_net1, accounts[1]); +// await bmc.addVerifier(_net2, accounts[2]); +// await bmc.addLink(_bmcICON); +// await holder.addBSHContract(bts_periphery.address, bts_core.address); +// await bts_core.register(_name1, "", 18); +// await bts_core.register(_name2, "", 18); +// await bts_core.register(_name3, "", 18); +// await bts_core.register(_name4, "", 18); +// let _msg1 = await encode_msg.encodeTransferMsgWithAddress( +// _from1, +// holder.address, +// _name1, +// _value1 +// ); +// await bmc.receiveRequest(_bmcICON, "", service, _sn0, _msg1); +// let _msg2 = await encode_msg.encodeTransferMsgWithAddress( +// _from2, +// holder.address, +// _name2, +// _value2 +// ); +// await bmc.receiveRequest(_bmcICON, "", service, _sn1, _msg2); +// await bts_core.transferNativeCoin(_to1, { +// from: accounts[0], +// value: _txAmt, +// }); +// let _responseMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_OK, +// "" +// ); +// await bmc.receiveResponse(_net1, service, _sn0, _responseMsg); +// await holder.setApprove(bts_core.address); +// await holder.callTransfer(_name1, _txAmt1, _to1); +// await bmc.receiveResponse(_net1, service, _sn1, _responseMsg); +// await holder.callTransfer(_name2, _txAmt2, _to2); +// await bmc.receiveResponse(_net1, service, _sn2, _responseMsg); +// }); +// +// it(`Scenario 1: Query 'Aggregation Fee'`, async () => { +// let aggregationFee = await bts_core.getAccumulatedFees(); +// +// assert.equal(aggregationFee.length, 5); +// assert.equal(aggregationFee[0].coinName, "PARA"); +// assert.equal(aggregationFee[1].coinName, "ICON"); +// assert.equal(aggregationFee[2].coinName, "BINANCE"); +// assert.equal(aggregationFee[3].coinName, "ETHEREUM"); +// assert.equal(aggregationFee[4].coinName, "TRON"); +// +// assert.equal( +// Number(aggregationFee[0].value), +// Math.floor(_txAmt / 1000) + _fixed_fee +// ); +// assert.equal( +// Number(aggregationFee[1].value), +// Math.floor(_txAmt1 / 1000) + _fixed_fee +// ); +// assert.equal( +// Number(aggregationFee[2].value), +// Math.floor(_txAmt2 / 1000) + _fixed_fee +// ); +// assert.equal(Number(aggregationFee[3].value), 0); +// assert.equal(Number(aggregationFee[4].value), 0); +// }); +// +// it("Scenario 2: Receiving a FeeGathering request not from BMCService", async () => { +// let _sn3 = 3; +// let FA1Before = await bts_periphery.getAggregationFeeOf(_native); // state Aggregation Fee of each type of Coins +// let FA2Before = await bts_periphery.getAggregationFeeOf(_name1); +// let FA3Before = await bts_periphery.getAggregationFeeOf(_name2); +// await truffleAssert.reverts( +// bts_periphery.handleFeeGathering.call(_to1, service, { +// from: accounts[1], +// }), +// "Unauthorized" +// ); +// let FA1After = await bts_periphery.getAggregationFeeOf(_native); +// let FA2After = await bts_periphery.getAggregationFeeOf(_name1); +// let FA3After = await bts_periphery.getAggregationFeeOf(_name2); +// let fees = await bts_periphery.getFees(_sn3); // get pending Aggregation Fee list +// +// assert.equal( +// web3.utils.BN(FA1Before).toNumber(), +// web3.utils.BN(FA1After).toNumber() +// ); +// assert.equal( +// web3.utils.BN(FA2Before).toNumber(), +// web3.utils.BN(FA2After).toNumber() +// ); +// assert.equal( +// web3.utils.BN(FA3Before).toNumber(), +// web3.utils.BN(FA3After).toNumber() +// ); +// assert.equal(fees.amounts.length, 0); +// }); +// +// // Before: +// // + state Aggregation Fee of each type of Coins are set +// // + pendingAggregation Fee list is empty +// // After: +// // + all states of Aggregation Fee are push into pendingAggregation Fee list +// // + state Aggregation Fee of each type of Coins are reset +// it("Scenario 3: Handle GatherFee request from BMCService contract", async () => { +// let _sn3 = 4; +// let FA1Before = await bts_periphery.getAggregationFeeOf(_native); // state Aggregation Fee of each type of Coins +// let FA2Before = await bts_periphery.getAggregationFeeOf(_name1); +// let FA3Before = await bts_periphery.getAggregationFeeOf(_name2); +// let _bmcService = await encode_msg.encodeBMCService(_to1, [service]); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// "bmc", +// 100, +// _bmcService +// ); +// let FA1After = await bts_periphery.getAggregationFeeOf(_native); +// let FA2After = await bts_periphery.getAggregationFeeOf(_name1); +// let FA3After = await bts_periphery.getAggregationFeeOf(_name2); +// let fees = await bts_periphery.getFees(_sn3); // get pending Aggregation Fee list +// let list = []; +// for (let i = 0; i < fees.amounts.length; i++) { +// list[i] = [fees.coinNames[i], fees.amounts[i]]; +// } +// let _eventMsg = await encode_msg.encodeTransferFeesBMCMessage( +// btpAddr, +// _bmcICON, +// _to1, +// service, +// _sn3, +// bts_core.address, +// list +// ); +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferStart", +// { +// fromBlock: output.receipt.blockNumber, +// toBlock: "latest", +// } +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, bts_core.address); +// assert.equal(event._to, _to1); +// assert.equal(event._sn, _sn3); +// assert.equal(event._assetDetails.length, 3); +// assert.equal(event._assetDetails[0].coinName, _native); +// assert.equal(event._assetDetails[0].value, fees.amounts[0]); +// assert.equal(event._assetDetails[0].fee, 0); +// assert.equal(event._assetDetails[1].coinName, _name1); +// assert.equal(event._assetDetails[1].value, fees.amounts[1]); +// assert.equal(event._assetDetails[1].fee, 0); +// assert.equal(event._assetDetails[2].coinName, _name2); +// assert.equal(event._assetDetails[2].value, fees.amounts[2]); +// assert.equal(event._assetDetails[2].fee, 0); +// +// assert.equal( +// web3.utils.BN(FA1Before).toNumber(), +// Math.floor(_txAmt / 1000) + _fixed_fee +// ); +// assert.equal( +// web3.utils.BN(FA2Before).toNumber(), +// Math.floor(_txAmt1 / 1000) + _fixed_fee +// ); +// assert.equal( +// web3.utils.BN(FA3Before).toNumber(), +// Math.floor(_txAmt2 / 1000) + _fixed_fee +// ); +// +// assert.equal(web3.utils.BN(FA1After).toNumber(), 0); +// assert.equal(web3.utils.BN(FA2After).toNumber(), 0); +// assert.equal(web3.utils.BN(FA3After).toNumber(), 0); +// +// assert.equal(fees.coinNames[0], _native); +// assert.equal(fees.coinNames[1], _name1); +// assert.equal(fees.coinNames[2], _name2); +// +// assert.equal( +// Number(fees.amounts[0]), +// Math.floor(_txAmt / 1000) + _fixed_fee +// ); +// assert.equal( +// Number(fees.amounts[1]), +// Math.floor(_txAmt1 / 1000) + _fixed_fee +// ); +// assert.equal( +// Number(fees.amounts[2]), +// Math.floor(_txAmt2 / 1000) + _fixed_fee +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 4: Receiving a successful response", async () => { +// let _sn3 = 4; +// let feesBefore = await bts_periphery.getFees(_sn3); +// let _responseMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_OK, +// "" +// ); +// let tx = await bmc.receiveResponse(_net1, service, _sn3, _responseMsg); +// let feesAfter = await bts_periphery.getFees(_sn3); +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferEnd", +// { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// } +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, bts_core.address); +// assert.equal(event._sn, _sn3); +// assert.equal(event._code, 0); +// assert.equal(event._response, ""); +// +// assert.equal(feesBefore.amounts.length, 3); +// assert.equal(feesBefore.coinNames[0], _native); +// assert.equal(feesBefore.coinNames[1], _name1); +// assert.equal(feesBefore.coinNames[2], _name2); +// assert.equal( +// Number(feesBefore.amounts[0]), +// Math.floor(_txAmt / 1000) + _fixed_fee +// ); +// assert.equal( +// Number(feesBefore.amounts[1]), +// Math.floor(_txAmt1 / 1000) + _fixed_fee +// ); +// assert.equal( +// Number(feesBefore.amounts[2]), +// Math.floor(_txAmt2 / 1000) + _fixed_fee +// ); +// assert.equal(feesAfter.amounts.length, 0); +// }); +// +// it("Scenario 5: Receiving an error response", async () => { +// let _sn4 = 5; +// let _sn5 = 6; +// let _sn6 = 7; +// let _amt1 = 2000000; +// let _amt2 = 6000000; +// await holder.callTransfer(_name1, _amt1, _to1); +// let _responseMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_OK, +// "" +// ); +// await bmc.receiveResponse(_net1, service, _sn4, _responseMsg); +// await holder.callTransfer(_name2, _amt2, _to2); +// await bmc.receiveResponse(_net2, service, _sn5, _responseMsg); +// let _bmcService = await encode_msg.encodeBMCService(_to1, [service]); +// await bmc.receiveRequest(_bmcICON, "", "bmc", 100, _bmcService); +// +// let FA1Before = await bts_periphery.getAggregationFeeOf(_name1); +// let FA2Before = await bts_periphery.getAggregationFeeOf(_name2); +// let feesBefore = await bts_periphery.getFees(_sn6); +// let _errMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_ERR, +// "" +// ); +// let tx = await bmc.receiveResponse(_net1, service, _sn6, _errMsg); +// let FA1After = await bts_periphery.getAggregationFeeOf(_name1); +// let FA2After = await bts_periphery.getAggregationFeeOf(_name2); +// let feesAfter = await bts_periphery.getFees(_sn6); +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferEnd", +// { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// } +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, bts_core.address); +// assert.equal(event._sn, _sn6); +// assert.equal(event._code, 1); +// assert.equal(event._response, ""); +// +// assert.equal(feesBefore.amounts.length, 2); +// assert.equal(feesBefore.coinNames[0], _name1); +// assert.equal(feesBefore.coinNames[1], _name2); +// assert.equal( +// Number(feesBefore.amounts[0]), +// Math.floor(_amt1 / 1000) + _fixed_fee +// ); +// assert.equal( +// Number(feesBefore.amounts[1]), +// Math.floor(_amt2 / 1000) + _fixed_fee +// ); +// +// assert.equal(web3.utils.BN(FA1Before).toNumber(), 0); +// assert.equal(web3.utils.BN(FA2Before).toNumber(), 0); +// assert.equal(feesAfter.amounts.length, 0); +// assert.equal( +// web3.utils.BN(FA1After).toNumber(), +// Math.floor(_amt1 / 1000) + _fixed_fee +// ); +// assert.equal( +// web3.utils.BN(FA2After).toNumber(), +// Math.floor(_amt2 / 1000) + _fixed_fee +// ); +// }); +// }); +// +// contract("As a user, I want to receive multiple Coins/Tokens from ICON blockchain", (accounts) => { +// let bts_periphery, bts_core, bmc, holder, refundable; +// let service = "Coin/WrappedCoin"; +// let _uri = "https://github.com/icon-project/icon-bridge"; +// let _native = "PARA"; +// let _fee = 10; +// let _fixed_fee = 500000; +// let _name1 = "ICON"; +// let _name2 = "BINANCE"; +// let _name3 = "ETHEREUM"; +// let _name4 = "TRON"; +// let _net1 = "1234.iconee"; +// let _bmcICON = "btp://1234.iconee/0x1234567812345678"; +// let RC_OK = 0; +// let RC_ERR = 1; +// let _from1 = "0x12345678"; +// let _to = "btp://1234.iconee/0x12345678"; +// +// before(async () => { +// bts_periphery = await BTSPeriphery.new(); +// bts_core = await BTSCore.new(); +// bmc = await BMC.new("1234.pra"); +// encode_msg = await EncodeMsg.new(); +// await bts_periphery.initialize( +// bmc.address, +// bts_core.address, +// service +// ); +// await bts_core.initialize(_native, _fee, _fixed_fee); +// await bts_core.updateBTSPeriphery(bts_periphery.address); +// holder = await Holder.new(); +// refundable = await Refundable.new(); +// btpAddr = await bmc.bmcAddress(); +// await bmc.addService(service, bts_periphery.address); +// await bmc.addVerifier(_net1, accounts[1]); +// await bmc.addLink(_bmcICON); +// await holder.addBSHContract( +// bts_periphery.address, +// bts_core.address +// ); +// await bts_core.register(_name1, "", 18); +// await bts_core.register(_name2, "", 18); +// await bts_core.register(_name3, "", 18); +// await bts_core.register(_name4, "", 18); +// await bts_core.transferNativeCoin(_to, { +// from: accounts[0], +// value: 10000000, +// }); +// }); +// +// it("Scenario 1: Receiving address is invalid", async () => { +// let _value1 = 1000; +// let _value2 = 10000; +// let _value3 = 40000; +// let _address = "0x1234567890123456789"; +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "InvalidAddress" +// ); +// let _msg = await encode_msg.encodeBatchTransferMsgWithStringAddress( +// _from1, +// _address, +// [ +// [_native, _value1], +// [_name1, _value2], +// [_name2, _value3], +// ] +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 2: BSHPerphery receives a request of invalid token", async () => { +// let _value1 = 1000; +// let _value2 = 10000; +// let _value3 = 40000; +// let _invalid_token = "EOS"; +// let balance1Before = await bts_core.balanceOf( +// holder.address, +// _name1 +// ); +// let balance2Before = await bts_core.balanceOf( +// holder.address, +// _name2 +// ); +// let balance3Before = await bts_core.balanceOf( +// holder.address, +// _invalid_token +// ); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "UnregisteredCoin" +// ); +// let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( +// _from1, +// holder.address, +// [ +// [_name1, _value1], +// [_name2, _value2], +// [_invalid_token, _value3], +// ] +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balance1After = await bts_core.balanceOf( +// holder.address, +// _name1 +// ); +// let balance2After = await bts_core.balanceOf( +// holder.address, +// _name2 +// ); +// let balance3After = await bts_core.balanceOf( +// holder.address, +// _invalid_token +// ); +// +// assert.equal( +// web3.utils.BN(balance1Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance3Before._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balance1After._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2After._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance3After._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 3: One of requests is failed in TransferBatch", async () => { +// let _value1 = 1000; +// let _value2 = 10000; +// let _value3 = 20000000; +// let balance1Before = await bts_core.balanceOf( +// accounts[1], +// _name1 +// ); +// let balance2Before = await bts_core.balanceOf( +// accounts[1], +// _name2 +// ); +// let balance3Before = await bts_core.balanceOf( +// accounts[1], +// _native +// ); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "TransferFailed" +// ); +// let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( +// _from1, +// accounts[1], +// [ +// [_name1, _value1], +// [_name2, _value2], +// [_native, _value3], +// ] +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balance1After = await bts_core.balanceOf( +// accounts[1], +// _name1 +// ); +// let balance2After = await bts_core.balanceOf( +// accounts[1], +// _name2 +// ); +// let balance3After = await bts_core.balanceOf( +// accounts[1], +// _native +// ); +// +// assert.equal( +// web3.utils.BN(balance1Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2Before._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balance1After._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2After._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 4: One of requests is failed in TransferBatch", async () => { +// let _value1 = 1000; +// let _value2 = 10000; +// let _value3 = 40000; +// let balance1Before = await bts_core.balanceOf( +// refundable.address, +// _native +// ); +// let balance2Before = await bts_core.balanceOf( +// refundable.address, +// _name1 +// ); +// let balance3Before = await bts_core.balanceOf( +// refundable.address, +// _name2 +// ); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "TransferFailed" +// ); +// let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( +// _from1, +// refundable.address, +// [ +// [_native, _value1], +// [_name1, _value2], +// [_name2, _value3], +// ] +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balance1After = await bts_core.balanceOf( +// refundable.address, +// _native +// ); +// let balance2After = await bts_core.balanceOf( +// refundable.address, +// _name1 +// ); +// let balance3After = await bts_core.balanceOf( +// refundable.address, +// _name2 +// ); +// +// assert.equal( +// web3.utils.BN(balance1Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance3Before._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balance1After._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2After._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance3After._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 5: One of requests is failed in TransferBatch", async () => { +// let _value1 = 1000; +// let _value2 = 10000; +// let _value3 = 40000; +// let balance1Before = await bts_core.balanceOf( +// holder.address, +// _name1 +// ); +// let balance2Before = await bts_core.balanceOf( +// holder.address, +// _name2 +// ); +// let balance3Before = await bts_core.balanceOf( +// holder.address, +// _native +// ); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_ERR, +// "TransferFailed" +// ); +// let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( +// _from1, +// holder.address, +// [ +// [_name1, _value1], +// [_name2, _value2], +// [_native, _value3], +// ] +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balance1After = await bts_core.balanceOf( +// holder.address, +// _name1 +// ); +// let balance2After = await bts_core.balanceOf( +// holder.address, +// _name2 +// ); +// let balance3After = await bts_core.balanceOf( +// holder.address, +// _native +// ); +// +// assert.equal( +// web3.utils.BN(balance1Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance3Before._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balance1After._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2After._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance3After._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 6: Receiving a successful TransferBatch request", async () => { +// let _value1 = 1000; +// let _value2 = 10000; +// let _value3 = 40000; +// let balance1Before = await bts_core.balanceOf( +// holder.address, +// _name1 +// ); +// let balance2Before = await bts_core.balanceOf( +// holder.address, +// _name2 +// ); +// let balance3Before = await bts_core.balanceOf( +// holder.address, +// _name3 +// ); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_OK, +// "" +// ); +// let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( +// _from1, +// holder.address, +// [ +// [_name1, _value1], +// [_name2, _value2], +// [_name3, _value3], +// ] +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balance1After = await bts_core.balanceOf( +// holder.address, +// _name1 +// ); +// let balance2After = await bts_core.balanceOf( +// holder.address, +// _name2 +// ); +// let balance3After = await bts_core.balanceOf( +// holder.address, +// _name3 +// ); +// +// assert.equal( +// web3.utils.BN(balance1Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance2Before._usableBalance).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balance3Before._usableBalance).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balance1After._usableBalance).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balance2After._usableBalance).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balance3After._usableBalance).toNumber(), +// _value3 +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// +// it("Scenario 7: Receiving a successful TransferBatch request", async () => { +// let _value1 = 1000; +// let _value2 = 10000; +// let _value3 = 40000; +// let balance1Before = await bts_core.balanceOf( +// accounts[1], +// _native +// ); +// let balance2Before = await bts_core.balanceOf( +// accounts[1], +// _name2 +// ); +// let balance3Before = await bts_core.balanceOf( +// accounts[1], +// _name3 +// ); +// let _eventMsg = await encode_msg.encodeResponseBMCMessage( +// btpAddr, +// _bmcICON, +// service, +// 10, +// RC_OK, +// "" +// ); +// let _msg = await encode_msg.encodeBatchTransferMsgWithAddress( +// _from1, +// accounts[1], +// [ +// [_native, _value1], +// [_name2, _value2], +// [_name3, _value3], +// ] +// ); +// let output = await bmc.receiveRequest( +// _bmcICON, +// "", +// service, +// 10, +// _msg +// ); +// let balance1After = await bts_core.balanceOf( +// accounts[1], +// _native +// ); +// let balance2After = await bts_core.balanceOf( +// accounts[1], +// _name2 +// ); +// let balance3After = await bts_core.balanceOf( +// accounts[1], +// _name3 +// ); +// +// assert.equal( +// web3.utils.BN(balance1After._usableBalance).toString(), +// web3.utils +// .BN(balance1Before._usableBalance) +// .add(new web3.utils.BN(_value1)) +// .toString() +// ); +// assert.equal( +// web3.utils.BN(balance2After._usableBalance).toNumber(), +// web3.utils.BN(balance2Before._usableBalance).toNumber() + +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balance3After._usableBalance).toNumber(), +// web3.utils.BN(balance3Before._usableBalance).toNumber() + +// _value3 +// ); +// +// assert.equal(output.logs[0].args._next, _bmcICON); +// assert.equal(output.logs[0].args._msg, _eventMsg); +// }); +// } +// ); +// +// contract("As a user, I want to send multiple coins/tokens to ICON blockchain", (accounts) => { +// let bts_periphery, bts_core, bmc, holder; +// let service = "Coin/WrappedCoin"; +// let _uri = "https://github.com/icon-project/icon-bridge"; +// let _native = "PARA"; +// let _fee = 10; +// let _fixed_fee = 500000; +// let _net = "1234.iconee"; +// let _from = "0x12345678"; +// let _value = 999999999999999; +// let REPONSE_HANDLE_SERVICE = 2; +// let RC_OK = 0; +// let RC_ERR = 1; +// let _bmcICON = "btp://1234.iconee/0x1234567812345678"; +// let _coin1 = "ICON"; +// let _coin2 = "TRON"; +// let _coin3 = "BINANCE"; +// let initAmt = 1000000000000000; +// +// before(async () => { +// bts_periphery = await BTSPeriphery.new(); +// bts_core = await BTSCore.new(); +// bmc = await BMC.new("1234.pra"); +// encode_msg = await EncodeMsg.new(); +// await bts_periphery.initialize( +// bmc.address, +// bts_core.address, +// service +// ); +// await bts_core.initialize(_native, _fee, _fixed_fee); +// await bts_core.updateBTSPeriphery(bts_periphery.address); +// holder = await Holder.new(); +// await bmc.addService(service, bts_periphery.address); +// await bmc.addVerifier(_net, accounts[1]); +// await bmc.addLink(_bmcICON); +// await holder.addBSHContract( +// bts_periphery.address, +// bts_core.address +// ); +// await bts_core.register(_coin1, "", 18); +// await bts_core.register(_coin2, "", 18); +// await bts_core.register(_coin3, "", 18); +// await bts_core.transferNativeCoin("btp://1234.iconee/0x12345678", { +// from: accounts[0], +// value: initAmt, +// }); +// await holder.deposit({from: accounts[1], value: 100000000000000}); +// let _msg1 = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// holder.address, +// _coin1, +// _value +// ); +// await bmc.receiveRequest(_bmcICON, "", service, 0, _msg1); +// let _msg2 = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// holder.address, +// _coin2, +// _value +// ); +// await bmc.receiveRequest(_bmcICON, "", service, 1, _msg2); +// let _msg3 = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// holder.address, +// _coin3, +// _value +// ); +// await bmc.receiveRequest(_bmcICON, "", service, 2, _msg3); +// +// _msg1 = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// accounts[1], +// _coin1, +// _value +// ); +// await bmc.receiveRequest(_bmcICON, "", service, 0, _msg1); +// _msg2 = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// accounts[1], +// _coin2, +// _value +// ); +// await bmc.receiveRequest(_bmcICON, "", service, 1, _msg2); +// _msg3 = await encode_msg.encodeTransferMsgWithAddress( +// _from, +// accounts[1], +// _coin3, +// _value +// ); +// await bmc.receiveRequest(_bmcICON, "", service, 2, _msg3); +// }); +// +// it("Scenario 1: User has not yet set approval for token being transferred out by Operator", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _values = [600000, 700000]; +// let _native_amt = 800000; +// let _query = [_native, _coin1, _coin2]; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_core.address, +// _coins, +// _values, +// _to, +// _native_amt +// ), +// "revert" +// ); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _query +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it(`Scenario 2: User has set approval, but user's balance has insufficient amount`, async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _values = [600000, 9999999999999999n]; +// let _native_amt = 700000; +// let _query = [_native, _coin1, _coin2]; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// await holder.setApprove(bts_core.address); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_core.address, +// _coins, +// _values, +// _to, +// _native_amt +// ), +// "revert" +// ); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _query +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 3: User requests to transfer an invalid Token", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let invalid_token = "EOS"; +// let _coins = [_coin1, invalid_token]; +// let _values = [600000, 700000]; +// let _native_amt = 800000; +// let _query = [_native, _coin1, invalid_token]; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// await holder.setApprove(bts_core.address); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_core.address, +// _coins, +// _values, +// _to, +// _native_amt +// ), +// "revert" +// ); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _query +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 4: User transfers Tokens to an invalid BTP Address format", async () => { +// let _to = "1234.iconee/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _values = [600000, 700000]; +// let _query = [_native, _coin1, _coin2]; +// let _native_amt = 800000; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// await holder.setApprove(bts_core.address); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_core.address, +// _coins, +// _values, +// _to, +// _native_amt +// ), +// "revert" +// ); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _query +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 5: User requests to transfer zero Token", async () => { +// let _to = "1234.iconee/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _values = [600000, 0]; +// let _query = [_native, _coin1, _coin2]; +// let _native_amt = 800000; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// await holder.setApprove(bts_core.address); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_core.address, +// _coins, +// _values, +// _to, +// _native_amt +// ), +// "revert" +// ); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _query +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 6: Transffering amount is less than fixed fee", async () => { +// let _to = "1234.iconee/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _values = [600000, 300000]; +// let _query = [_native, _coin1, _coin2]; +// let _native_amt = 800000; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// await holder.setApprove(bts_core.address); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_core.address, +// _coins, +// _values, +// _to, +// _native_amt +// ), +// "revert" +// ); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _query +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 7: User requests to transfer to an invalid network/Not Supported Network", async () => { +// let _to = "btp://1234.eos/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _values = [600000, 700000]; +// let _query = [_native, _coin1, _coin2]; +// let _native_amt = 1000; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// await holder.setApprove(bts_core.address); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_core.address, +// _coins, +// _values, +// _to, +// _native_amt +// ), +// "revert" +// ); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _query +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 8: Account client sends an invalid request of transferBatch", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _coins = [_native, _native, _native]; +// let _values = [600000, 600000, 600000]; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// accounts[2], +// _coins +// ); +// await truffleAssert.reverts( +// bts_core.transferBatch.call(_coins, _values, _to, { +// from: accounts[2], +// value: 600000, +// }), +// "revert" +// ); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// accounts[2], +// _coins +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _coins +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// initAmt +// ); +// }); +// +// it("Scenario 9: Contract client sends an invalid request of transferBatch", async () => { +// let _to = "btp://1234.eos/0x12345678"; +// let _coins = [_native, _coin1, _coin2]; +// let _values = [600000, 700000]; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// await holder.setApprove(bts_core.address); +// await truffleAssert.reverts( +// holder.callTransferBatch.call( +// bts_core.address, +// _coins, +// _values, +// _to, +// 0 +// ), +// "revert" +// ); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _coins +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 0 +// ); +// }); +// +// it("Scenario 10: Contract client sends a valid transferBatch request", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _values = [_value2, _value3]; +// let _query = [_native, _coin1, _coin2]; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// await holder.setApprove(bts_core.address); +// let tx = await holder.callTransferBatch( +// bts_core.address, +// _coins, +// _values, +// _to, +// _value1 +// ); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _query +// ); +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferStart", +// {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, holder.address); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 2); +// assert.equal(event._assetDetails.length, 3); +// assert.equal(event._assetDetails[0].coinName, _coin1); +// assert.equal(event._assetDetails[0].value, _value2 - chargedFee2); +// assert.equal(event._assetDetails[0].fee, chargedFee2); +// assert.equal(event._assetDetails[1].coinName, _coin2); +// assert.equal(event._assetDetails[1].value, _value3 - chargedFee3); +// assert.equal(event._assetDetails[1].fee, chargedFee3); +// assert.equal(event._assetDetails[2].coinName, _native); +// assert.equal(event._assetDetails[2].value, _value1 - chargedFee1); +// assert.equal(event._assetDetails[2].fee, chargedFee1); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 2); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// holder.address +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _coin1 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// _value2 - chargedFee2 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), +// _coin2 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), +// _value3 - chargedFee3 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), +// _native +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), +// _value1 - chargedFee1 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt + _value1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// _value3 +// ); +// }); +// +// it("Scenario 11: BTSPeriphery receives a successful response of a recent request", async () => { +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _coins = [_native, _coin1, _coin2]; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let _responseMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_OK, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 2, _responseMsg); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let fees = await bts_core.getAccumulatedFees(); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _coins +// ); +// +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferEnd", +// {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, holder.address); +// assert.equal(event._sn, 2); +// assert.equal(event._code, 0); +// assert.equal(event._response, ""); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() +// ); +// +// assert.equal(fees[0].coinName, _native); +// assert.equal(Number(fees[0].value), chargedFee1); +// assert.equal(fees[1].coinName, _coin1); +// assert.equal(Number(fees[1].value), chargedFee2); +// assert.equal(fees[2].coinName, _coin2); +// assert.equal(Number(fees[2].value), chargedFee3); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt + _value1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// chargedFee3 +// ); +// }); +// +// it("Scenario 12: Account client sends a valid transferBatch request", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _coins = [_coin3, _coin1, _coin2]; +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _values = [_value1, _value2, _value3]; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// accounts[1], +// _coins +// ); +// await bts_core.setApprovalForAll(bts_core.address, true, { +// from: accounts[1], +// }); +// let tx = await bts_core.transferBatch(_coins, _values, _to, { +// from: accounts[1], +// }); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// accounts[1], +// _coins +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _coins +// ); +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferStart", +// {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, accounts[1]); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 3); +// assert.equal(event._assetDetails.length, 3); +// assert.equal(event._assetDetails[0].coinName, _coin3); +// assert.equal(event._assetDetails[0].value, _value1 - chargedFee1); +// assert.equal(event._assetDetails[0].fee, chargedFee1); +// assert.equal(event._assetDetails[1].coinName, _coin1); +// assert.equal(event._assetDetails[1].value, _value2 - chargedFee2); +// assert.equal(event._assetDetails[1].fee, chargedFee2); +// assert.equal(event._assetDetails[2].coinName, _coin2); +// assert.equal(event._assetDetails[2].value, _value3 - chargedFee3); +// assert.equal(event._assetDetails[2].fee, chargedFee3); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 3); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// accounts[1] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _coin3 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// _value1 - chargedFee1 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), +// _coin1 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), +// _value2 - chargedFee2 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), +// _coin2 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), +// _value3 - chargedFee3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// _value2 + chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// _value3 + chargedFee3 +// ); +// }); +// +// it("Scenario 13: BTSPeriphery receives an error response of a recent request", async () => { +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _coins = [_coin3, _coin1, _coin2]; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// accounts[1], +// _coins +// ); +// let _responseMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_ERR, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 3, _responseMsg); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// accounts[1], +// _coins +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _coins +// ); +// +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferEnd", +// {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, accounts[1]); +// assert.equal(event._sn, 3); +// assert.equal(event._code, 1); +// assert.equal(event._response, ""); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() + +// _value1 - +// chargedFee1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() + +// _value2 - +// chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() + +// _value3 - +// chargedFee3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// chargedFee1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 2 * chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 2 * chargedFee3 +// ); +// }); +// +// it("Scenario 14: Contract client sends a valid transferBatch request", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _coins = [_coin3, _coin1, _coin2]; +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _values = [_value1, _value2, _value3]; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// await holder.setApprove(bts_core.address); +// let tx = await holder.callTransferBatch( +// bts_core.address, +// _coins, +// _values, +// _to, +// 0 +// ); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _coins +// ); +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferStart", +// {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, holder.address); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 4); +// assert.equal(event._assetDetails.length, 3); +// assert.equal(event._assetDetails[0].coinName, _coin3); +// assert.equal(event._assetDetails[0].value, _value1 - chargedFee1); +// assert.equal(event._assetDetails[0].fee, chargedFee1); +// assert.equal(event._assetDetails[1].coinName, _coin1); +// assert.equal(event._assetDetails[1].value, _value2 - chargedFee2); +// assert.equal(event._assetDetails[1].fee, chargedFee2); +// assert.equal(event._assetDetails[2].coinName, _coin2); +// assert.equal(event._assetDetails[2].value, _value3 - chargedFee3); +// assert.equal(event._assetDetails[2].fee, chargedFee3); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 4); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// holder.address +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _coin3 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// _value1 - chargedFee1 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), +// _coin1 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), +// _value2 - chargedFee2 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), +// _coin2 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), +// _value3 - chargedFee3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// _value1 + chargedFee1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// _value2 + 2 * chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// _value3 + 2 * chargedFee3 +// ); +// }); +// +// it("Scenario 15: BTSPeriphery receives an error response of a recent request", async () => { +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _coins = [_coin3, _coin1, _coin2]; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let _responseMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_ERR, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 4, _responseMsg); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _coins +// ); +// +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferEnd", +// {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, holder.address); +// assert.equal(event._sn, 4); +// assert.equal(event._code, 1); +// assert.equal(event._response, ""); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() + +// _value1 - +// chargedFee1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() + +// _value2 - +// chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() + +// _value3 - +// chargedFee3 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// 2 * chargedFee1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 3 * chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 3 * chargedFee3 +// ); +// }); +// +// // This test is replicated from Scenario 10 +// it("Scenario 16: Contract client sends a valid transferBatch request", async () => { +// let _to = "btp://1234.iconee/0x12345678"; +// let _coins = [_coin1, _coin2]; +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _values = [_value2, _value3]; +// let _query = [_native, _coin1, _coin2]; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// await holder.setApprove(bts_core.address); +// let tx = await holder.callTransferBatch( +// bts_core.address, +// _coins, +// _values, +// _to, +// _value1 +// ); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// holder.address, +// _query +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _query +// ); +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferStart", +// {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} +// ); +// let event = transferEvents[0].returnValues; +// assert.equal(event._from, holder.address); +// assert.equal(event._to, _to); +// assert.equal(event._sn, 5); +// assert.equal(event._assetDetails.length, 3); +// assert.equal(event._assetDetails[0].coinName, _coin1); +// assert.equal(event._assetDetails[0].value, _value2 - chargedFee2); +// assert.equal(event._assetDetails[0].fee, chargedFee2); +// assert.equal(event._assetDetails[1].coinName, _coin2); +// assert.equal(event._assetDetails[1].value, _value3 - chargedFee3); +// assert.equal(event._assetDetails[1].fee, chargedFee3); +// assert.equal(event._assetDetails[2].coinName, _native); +// assert.equal(event._assetDetails[2].value, _value1 - chargedFee1); +// assert.equal(event._assetDetails[2].fee, chargedFee1); +// +// const linkStatus = await bmc.getStatus(_bmcICON); +// const bmcBtpAddress = await bmc.getBmcBtpAddress(); +// +// const messageEvents = await bmc.getPastEvents("Message", { +// fromBlock: tx.receipt.blockNumber, +// toBlock: "latest", +// }); +// event = messageEvents[0].returnValues; +// assert.equal(event._next, _bmcICON); +// assert.equal(event._seq, linkStatus.txSeq); +// +// const bmcMsg = rlp.decode(event._msg); +// +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[0])), bmcBtpAddress); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[1])), _bmcICON); +// assert.equal(web3.utils.hexToUtf8(toHex(bmcMsg[2])), service); +// assert.equal(web3.utils.hexToNumber(toHex(bmcMsg[3])), 5); +// +// const ServiceMsg = rlp.decode(bmcMsg[4]); +// assert.equal(web3.utils.hexToUtf8(toHex(ServiceMsg[0])), 0); +// +// const coinTransferMsg = rlp.decode(ServiceMsg[1]); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[0])), +// holder.address +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[1])), +// _to.split("/").slice(-1)[0] +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][0][0])), +// _coin1 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][0][1])), +// _value2 - chargedFee2 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][1][0])), +// _coin2 +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][1][1])), +// _value3 - chargedFee3 +// ); +// assert.equal( +// web3.utils.hexToUtf8(toHex(coinTransferMsg[2][2][0])), +// _native +// ); +// assert.equal( +// web3.utils.hexToNumber(toHex(coinTransferMsg[2][2][1])), +// _value1 - chargedFee1 +// ); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() - +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() - +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() - +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt + 2 * _value1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// _value2 + 3 * chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// _value3 + 3 * chargedFee3 +// ); +// }); +// +// it("Scenario 17: BTSPeriphery receives an error response of a recent request", async () => { +// let _value1 = 600000; +// let _value2 = 700000; +// let _value3 = 800000; +// let _coins = [_native, _coin1, _coin2]; +// let balanceBefore = await bts_core.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let _responseMsg = await encode_msg.encodeResponseMsg( +// REPONSE_HANDLE_SERVICE, +// RC_ERR, +// "" +// ); +// let tx = await bmc.receiveResponse(_net, service, 5, _responseMsg); +// let balanceAfter = await bts_core.getBalanceOfBatch( +// holder.address, +// _coins +// ); +// let bts_core_balance = await bts_core.getBalanceOfBatch( +// bts_core.address, +// _coins +// ); +// let chargedFee1 = Math.floor(_value1 / 1000) + _fixed_fee; +// let chargedFee2 = Math.floor(_value2 / 1000) + _fixed_fee; +// let chargedFee3 = Math.floor(_value3 / 1000) + _fixed_fee; +// +// const transferEvents = await bts_periphery.getPastEvents( +// "TransferEnd", +// {fromBlock: tx.receipt.blockNumber, toBlock: "latest"} +// ); +// let event = transferEvents[0].returnValues; +// +// assert.equal(event._from, holder.address); +// assert.equal(event._sn, 5); +// assert.equal(event._code, 1); +// assert.equal(event._response, ""); +// +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[0]).toNumber(), +// _value1 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[1]).toNumber(), +// _value2 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._lockedBalances[2]).toNumber(), +// _value3 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[1]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._lockedBalances[2]).toNumber(), +// 0 +// ); +// +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[0]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[0]).toNumber() +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[1]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[1]).toNumber() + +// _value2 - +// chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._usableBalances[2]).toNumber(), +// web3.utils.BN(balanceBefore._usableBalances[2]).toNumber() + +// _value3 - +// chargedFee3 +// ); +// assert.equal( +// web3.utils.BN(balanceBefore._refundableBalances[0]).toNumber(), +// 0 +// ); +// assert.equal( +// web3.utils.BN(balanceAfter._refundableBalances[0]).toNumber(), +// _value1 - chargedFee1 +// ); +// +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[0]).toNumber(), +// initAmt + 2 * _value1 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[1]).toNumber(), +// 4 * chargedFee2 +// ); +// assert.equal( +// web3.utils.BN(bts_core_balance._usableBalances[2]).toNumber(), +// 4 * chargedFee3 +// ); +// }); +// } +// ); diff --git a/solidity/bts/test/unit/1-upgradeability-bts.js b/solidity/bts/test/unit/1-upgradeability-bts.js index 75dd8d19d..7c2afaa1a 100644 --- a/solidity/bts/test/unit/1-upgradeability-bts.js +++ b/solidity/bts/test/unit/1-upgradeability-bts.js @@ -1,5 +1,5 @@ -const BTSCoreTestV1 = artifacts.require("BTSCoreTestV1"); -const BTSCoreTestV2 = artifacts.require("BTSCoreTestV2"); +const BTSCoreTestV1 = artifacts.require("BTSCore"); +const BTSCoreTestV2 = artifacts.require("MockBTSCore"); const BTSPeriphery = artifacts.require("BTSPeriphery"); const BMC = artifacts.require("MockBMC"); const {assert} = require("chai");