Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tests: SynapseBridge bridging in + gas airdrop #167

Open
wants to merge 19 commits into
base: feature/fix-airdrop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,10 @@ jobs:
env:
ALCHEMY_API: ${{ secrets.ALCHEMY_API }}
ARBITRUM_API: ${{ secrets.ARBITRUM_API }}
AURORA_API: https://mainnet.aurora.dev
AVAX_API: https://api.avax.network/ext/bc/C/rpc
BSC_API: ${{ secrets.BSC_API }}
BOBA_API: https://mainnet.boba.network
MOVR_API: https://moonriver.api.onfinality.io/public
OPTIMISM_API: ${{ secrets.OPTIMISM_API }}
FOUNDRY_FUZZ_RUNS: 64
Expand Down
6 changes: 3 additions & 3 deletions contracts/bridge/SynapseBridge.sol
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ contract SynapseBridge is Initializable, AccessControlUpgradeable, ReentrancyGua
mapping(address => uint256) private fees;

uint256 public startBlockNumber;
uint256 public constant bridgeVersion = 6;
uint256 public constant bridgeVersion = 7;
uint256 public chainGasAmount;
address payable public WETH_ADDRESS;

Expand Down Expand Up @@ -213,9 +213,9 @@ contract SynapseBridge is Initializable, AccessControlUpgradeable, ReentrancyGua
IWETH9(WETH_ADDRESS).withdraw(amount.sub(fee));
(bool success, ) = to.call{value: amount.sub(fee)}("");
require(success, "ETH_TRANSFER_FAILED");
emit TokenWithdraw(to, token, amount, fee, kappa);
emit TokenWithdraw(to, token, amount.sub(fee), fee, kappa);
} else {
emit TokenWithdraw(to, token, amount, fee, kappa);
emit TokenWithdraw(to, token, amount.sub(fee), fee, kappa);
token.safeTransfer(to, amount.sub(fee));
}
}
Expand Down
7 changes: 4 additions & 3 deletions foundry.toml
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
[default]
[profile.default]
optimizer = true
optimizer_runs = 200
auto_detect_solc = true
src = "contracts"
out = "artifacts"
libs = ["node_modules"]
fs_permissions = [{ access = "read", path = "./"}]

## set only when the `hardhat` profile is selected
[hardhat]
[profile.hardhat]
src = "contracts"
out = "artifacts"
libs = ["node_modules"]

[ci]
[profile.ci]
verbosity = 4

# See more config options https://github.com/gakonst/foundry/tree/master/config
14 changes: 13 additions & 1 deletion scripts/foundry.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,16 @@ forge test --match-contract "$1.*TestArb$" --fork-url $ARBITRUM_API --fork-block
forge test --match-contract "$1.*TestOpt$" --fork-url $OPTIMISM_API --fork-block-number 6600000 -vvv || exit 1

# Test contracts ending with exactly "TestMovr" require Moonriver RPC and block number: 2022-04-21
forge test --match-contract "$1.*TestMovr$" --fork-url $MOVR_API --fork-block-number 1730000 -vvv || exit 1
forge test --match-contract "$1.*TestMovr$" --fork-url $MOVR_API --fork-block-number 1730000 -vvv || exit 1

# Test contracts ending with exactly "TestAurora" require Aurora RPC and block number: 2022-06-24
forge test --match-contract "$1.*TestAurora$" --fork-url $AURORA_API --fork-block-number 68400000 -vvv || exit 1

# Test contracts ending with exactly "TestBoba" require Boba RPC and block number: 2022-06-25
forge test --match-contract "$1.*TestBoba$" --fork-url $BOBA_API --fork-block-number 697000 -vvv || exit 1

# Test contracts ending with exactly "TestBSC" require BSC RPC and block number: 2022-06-25
forge test --match-contract "$1.*TestBSC$" --fork-url $BSC_API --fork-block-number 19000000 -vvv || exit 1

# Test contracts ending with exactly "TestKlay" require KLAY RPC and block number: 2022-09-14
forge test --match-contract "$1.*TestKlay$" --fork-url $KLAY_API --fork-block-number 101222300 -vvv || exit 1
39 changes: 39 additions & 0 deletions test/bridge/forked/BridgeTestArb.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./DefaultBridgeForkTest.sol";

contract BridgeTestArb is DefaultBridgeForkTest {
// solhint-disable no-empty-blocks
BridgeTestSetup private setup =
BridgeTestSetup({
bridge: 0x6F4e8eBa4D337f874Ab57478AcC2Cb5BACdc19c9,
wgas: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1,
tokenMint: 0x080F6AEd32Fc474DD5717105Dba5ea57268F46eb, //SYN
tokenWithdraw: 0xfc5A1A6EB076a2C7aD06eD22C90d7E710E35ad0a // GMX
});

// kappas present at block 10600000
bytes32[4] private kappas = [
bytes32(0x42308a78f0e1563ffb36719b5d60d4751b9975875490f7acb0eaf1a96d2d2cd6),
bytes32(0x4a8d42610031767bd7fd42c2521848fb563b51202f7576e8ee881fcabacf27a7),
bytes32(0x7ef45d179685768dd2a2a4a660305f4ac63a6d032dc9abfdc7acd45043881d41),
bytes32(0x27454ce7fa3b7a20aa6e5fcd66703ea4ebd8971bbab3e72dd1dcb6a0802b5ade)
];

bool internal constant IS_MAINNET = false;
bool internal constant IS_GAS_WITHDRAWABLE = false;

address internal constant NUSD = 0x2913E812Cf0dcCA30FB28E6Cac3d2DCFF4497688;
address internal constant NUSD_POOL = 0x9Dd329F5411466d9e0C488fF72519CA9fEf0cb40;

address internal constant NETH = 0x3ea9B0ab55F34Fb188824Ee288CeaEfC63cf908e;
address internal constant NETH_POOL = 0xa067668661C84476aFcDc6fA5D758C4c01C34352;

constructor() DefaultBridgeForkTest(IS_MAINNET, IS_GAS_WITHDRAWABLE, setup, kappas) {}

function _initSwapArrays() internal override {
_addTokenPool(NUSD, NUSD_POOL);
_addTokenPool(NETH, NETH_POOL);
}
}
43 changes: 43 additions & 0 deletions test/bridge/forked/BridgeTestAurora.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./DefaultBridgeForkTest.sol";

contract BridgeTestAurora is DefaultBridgeForkTest {
// solhint-disable no-empty-blocks
BridgeTestSetup private setup =
BridgeTestSetup({
bridge: 0xaeD5b25BE1c3163c907a471082640450F928DDFE,
wgas: 0xC9BdeEd33CD01541e1eeD10f90519d2C06Fe3feB, // TriSolaris WETH
tokenMint: 0xd80d8688b02B3FD3afb81cDb124F188BB5aD0445, //SYN
tokenWithdraw: ZERO
});

// kappas present at block 68400000
bytes32[4] private kappas = [
bytes32(0xb7c657d30c7e8ffb23ab9242c500e13f6c0708f72fa4661d59d531ba57b1c1fe),
bytes32(0x9a42d0bef608ba07f43547b97afcdba513416e8f911ebb0e38e344f0d50d67a6),
bytes32(0x2b89321c8fc73102f79ebeb35569073e23852fe6bc8aee7c4aba775fb0095256),
bytes32(0x1ffb874d7d099837439f58c943946861682fc1f948388bd18b1893c46a0272bb)
];

bool internal constant IS_MAINNET = false;
bool internal constant IS_GAS_WITHDRAWABLE = false;

address internal constant NUSD = 0x07379565cD8B0CaE7c60Dc78e7f601b34AF2A21c;
address internal constant NUSD_POOL = 0xcEf6C2e20898C2604886b888552CA6CcF66933B0;
address internal constant NUSD_POOL_NEW = 0xCCd87854f58773fe75CdDa542457aC48E46c2D65;

constructor() DefaultBridgeForkTest(IS_MAINNET, IS_GAS_WITHDRAWABLE, setup, kappas) {}

function _initSwapArrays() internal override {
_addTokenPool(NUSD, NUSD_POOL);
}

function test_update_nUSD() public {
delete bridgeTokens;
delete swaps;
_addTokenPool(NUSD, NUSD_POOL_NEW);
test_mintAndSwap();
}
}
39 changes: 39 additions & 0 deletions test/bridge/forked/BridgeTestAvax.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./DefaultBridgeForkTest.sol";

contract BridgeTestAvax is DefaultBridgeForkTest {
// solhint-disable no-empty-blocks
BridgeTestSetup private setup =
BridgeTestSetup({
bridge: 0xC05e61d0E7a63D27546389B7aD62FdFf5A91aACE,
wgas: 0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7, // WAVAX
tokenMint: 0x1f1E7c893855525b303f99bDF5c3c05Be09ca251, // SYN
tokenWithdraw: ZERO
});

// kappas present at block 13897000
bytes32[4] private kappas = [
bytes32(0x156feccddaf55f130f9685cc7660769919a777b548c580e4f62977ae7a6b5dc3),
bytes32(0xd6f1ba89bb5210df0d1fef6822774be36010a82b85a7fc2b2be7fa7845967d0e),
bytes32(0x27174336b55a799bfa24804089354e0c962d89944ca3533da5512a5b6544d49f),
bytes32(0x2fb5a5a3a37a82d063e3e87a5c4a0857298d0ed60650095b74e981b728003e6b)
];

bool internal constant IS_MAINNET = false;
bool internal constant IS_GAS_WITHDRAWABLE = true;

address internal constant NUSD = 0xCFc37A6AB183dd4aED08C204D1c2773c0b1BDf46;
address internal constant NUSD_POOL = 0xED2a7edd7413021d440b09D654f3b87712abAB66;

address internal constant NETH = 0x19E1ae0eE35c0404f835521146206595d37981ae;
address internal constant NETH_POOL = 0xdd60483Ace9B215a7c019A44Be2F22Aa9982652E; // AaveWrapper

constructor() DefaultBridgeForkTest(IS_MAINNET, IS_GAS_WITHDRAWABLE, setup, kappas) {}

function _initSwapArrays() internal override {
_addTokenPool(NUSD, NUSD_POOL);
_addTokenPool(NETH, NETH_POOL);
}
}
35 changes: 35 additions & 0 deletions test/bridge/forked/BridgeTestBSC.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./DefaultBridgeForkTest.sol";

contract BridgeTestBSC is DefaultBridgeForkTest {
// solhint-disable no-empty-blocks
BridgeTestSetup private setup =
BridgeTestSetup({
bridge: 0xd123f70AE324d34A9E76b67a27bf77593bA8749f,
wgas: 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c,
tokenMint: 0xa4080f1778e69467E905B8d6F72f6e441f9e9484, //SYN
tokenWithdraw: ZERO
});

// kappas present at block 19000000
bytes32[4] private kappas = [
bytes32(0x396d1038b343b069ec77c7f0ca678b227cdf1651fe351d440519417409ce0351),
bytes32(0x7179c323f997907a91abe798af325ad87211c46fa618b0e88373a1c9753f1f7f),
bytes32(0x2e29367f37c206dab43c683ca4148bbbd3b1c7825f225256708d85614ae1ea03),
bytes32(0xe4801baa6784585b148736fa6a7b1cff2a8d8e4552cb6eaf4d34ee622df045a3)
];

bool internal constant IS_MAINNET = false;
bool internal constant IS_GAS_WITHDRAWABLE = false;

address internal constant NUSD = 0x23b891e5C62E0955ae2bD185990103928Ab817b3;
address internal constant NUSD_POOL = 0x28ec0B36F0819ecB5005cAB836F4ED5a2eCa4D13;

constructor() DefaultBridgeForkTest(IS_MAINNET, IS_GAS_WITHDRAWABLE, setup, kappas) {}

function _initSwapArrays() internal override {
_addTokenPool(NUSD, NUSD_POOL);
}
}
39 changes: 39 additions & 0 deletions test/bridge/forked/BridgeTestBoba.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./DefaultBridgeForkTest.sol";

contract BridgeTestBoba is DefaultBridgeForkTest {
// solhint-disable no-empty-blocks
BridgeTestSetup private setup =
BridgeTestSetup({
bridge: 0x432036208d2717394d2614d6697c46DF3Ed69540,
wgas: 0xd203De32170130082896b4111eDF825a4774c18E,
tokenMint: 0xb554A55358fF0382Fb21F0a478C3546d1106Be8c, //SYN
tokenWithdraw: ZERO
});

// kappas present at block 697000
bytes32[4] private kappas = [
bytes32(0x113bb38ded0a49446d12b54b9387e15648833dffa7ee44efe65432f803222950),
bytes32(0x3998f0a20330cb7cab5ff95c4b54b1897b015e19db6e15f2c78ebbfbd62814ca),
bytes32(0x3b0b1eb39940f8b909258865a24a93946f0c597d1e90a867caec01aeb9d6b9e3),
bytes32(0xf153aef91cdd5d606b4d83fac85f523ac8a0cdbe439ed11330d973c3ec7af7f0)
];

bool internal constant IS_MAINNET = false;
bool internal constant IS_GAS_WITHDRAWABLE = false;

address internal constant NUSD = 0x6B4712AE9797C199edd44F897cA09BC57628a1CF;
address internal constant NUSD_POOL = 0x75FF037256b36F15919369AC58695550bE72fead;

address internal constant NETH = 0x96419929d7949D6A801A6909c145C8EEf6A40431;
address internal constant NETH_POOL = 0x753bb855c8fe814233d26Bb23aF61cb3d2022bE5;

constructor() DefaultBridgeForkTest(IS_MAINNET, IS_GAS_WITHDRAWABLE, setup, kappas) {}

function _initSwapArrays() internal override {
_addTokenPool(NUSD, NUSD_POOL);
_addTokenPool(NETH, NETH_POOL);
}
}
34 changes: 34 additions & 0 deletions test/bridge/forked/BridgeTestEth.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./DefaultBridgeForkTest.sol";

contract BridgeTestEth is DefaultBridgeForkTest {
BridgeTestSetup private setup =
BridgeTestSetup({
bridge: 0x2796317b0fF8538F253012862c06787Adfb8cEb6,
wgas: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,
tokenMint: 0x0f2D719407FdBeFF09D87557AbB7232601FD9F29, // SYN
tokenWithdraw: 0x853d955aCEf822Db058eb8505911ED77F175b99e // FRAX
});

// kappas present at block 14650000
bytes32[4] private kappas = [
bytes32(0x58b29a4cf220b60a7e46b76b9831686c0bfbdbfea19721ef8f2192ba28514485),
bytes32(0x3745754e018ed57dce0feda8b027f04b7e1369e7f74f1a247f5f7352d519021c),
bytes32(0xea5bc18a60d2f1b9ba5e5f8bfef3cd112c3b1a1ef74a0de8e5989441b1722524),
bytes32(0x1d4f3f6ed7690f1e5c1ff733d2040daa12fa484b3acbf37122ff334b46cf8b6d)
];

bool internal constant IS_MAINNET = true;
bool internal constant IS_GAS_WITHDRAWABLE = true;

address internal constant NUSD = 0x1B84765dE8B7566e4cEAF4D0fD3c5aF52D3DdE4F;
address internal constant NUSD_POOL = 0x1116898DdA4015eD8dDefb84b6e8Bc24528Af2d8;

constructor() DefaultBridgeForkTest(IS_MAINNET, IS_GAS_WITHDRAWABLE, setup, kappas) {} // solhint-disable-line no-empty-blocks

function _initSwapArrays() internal override {
_addTokenPool(NUSD, NUSD_POOL);
}
}
30 changes: 30 additions & 0 deletions test/bridge/forked/BridgeTestKlay.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./DefaultBridgeForkTest.sol";

contract BridgeTestKlay is DefaultBridgeForkTest {
// solhint-disable no-empty-blocks
BridgeTestSetup private setup =
BridgeTestSetup({
bridge: 0xAf41a65F786339e7911F4acDAD6BD49426F2Dc6b,
wgas: 0x5819b6af194A78511c79C85Ea68D2377a7e9335f, // WKLAY
tokenMint: ZERO, // SYN
tokenWithdraw: ZERO
});

// kappas present at block 101222300
bytes32[4] private kappas = [
bytes32(0xd92055af2ea7cdf48fcfe57087beab9b103abdf3a450c2d507d7581bd232be4e),
bytes32(0xd92055af2ea7cdf48fcfe57087beab9b103abdf3a450c2d507d7581bd232be4e),
bytes32(0xd92055af2ea7cdf48fcfe57087beab9b103abdf3a450c2d507d7581bd232be4e),
bytes32(0xd92055af2ea7cdf48fcfe57087beab9b103abdf3a450c2d507d7581bd232be4e)
];

bool internal constant IS_MAINNET = false;
bool internal constant IS_GAS_WITHDRAWABLE = true;

constructor() DefaultBridgeForkTest(IS_MAINNET, IS_GAS_WITHDRAWABLE, setup, kappas) {}

function _initSwapArrays() internal override {}
}
35 changes: 35 additions & 0 deletions test/bridge/forked/BridgeTestMovr.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./DefaultBridgeForkTest.sol";

contract BridgeTestMovr is DefaultBridgeForkTest {
// solhint-disable no-empty-blocks
BridgeTestSetup private setup =
BridgeTestSetup({
bridge: 0xaeD5b25BE1c3163c907a471082640450F928DDFE,
wgas: 0x98878B06940aE243284CA214f92Bb71a2b032B8A,
tokenMint: 0xd80d8688b02B3FD3afb81cDb124F188BB5aD0445, //SYN
tokenWithdraw: 0x76906411D07815491A5E577022757aD941fb5066 // veSOLAR
});

// kappas present at block 1730000
bytes32[4] private kappas = [
bytes32(0xa754cc36b39979866c76e0de4fa7fd32b3b6e0b96abc06ea763e399ac11ad9a3),
bytes32(0xae30f5d4b12aeb33e4adbe362d99e1d997f4849cda3dcf6fd3c87c7df7e2808a),
bytes32(0xb0bb7c2abc99805f98b922d3e7457edf501d8e2295dc2dd2e853116f3880a562),
bytes32(0x5c39b50f78d78a93ae30790b02b1ddf21284ab1437eea0ed11085ce4c13cbe46)
];

bool internal constant IS_MAINNET = false;
bool internal constant IS_GAS_WITHDRAWABLE = true;

address internal constant BRIDGE_ADMIN = 0x4bA30618fDcb184eC01a9B3CAe258CFc5786E70E;

constructor() DefaultBridgeForkTest(IS_MAINNET, IS_GAS_WITHDRAWABLE, setup, kappas) {}

function _initSwapArrays() internal override {
// TODO: set WETH_ADDRESS on Moonriver bridge
_setWethAddress(BRIDGE_ADMIN);
}
}
Loading