diff --git a/src/bridge/gasutils.ts b/src/bridge/gasutils.ts index 2d09d054..4da7aaf9 100644 --- a/src/bridge/gasutils.ts +++ b/src/bridge/gasutils.ts @@ -31,6 +31,10 @@ export namespace GasUtils { approveGasLimit: BigNumber.from(75000), } + const AURORA_GAS_PARAMS: GasParams = { + gasPrice: parseUnits('0', 'gwei'), + } + export function makeGasParams(chainId: number): GasParams { switch (chainId) { case ChainId.ETH: @@ -41,6 +45,8 @@ export namespace GasUtils { return ARBITRUM_GAS_PARAMS case ChainId.AVALANCHE: return AVALANCHE_GAS_PARAMS + case ChainId.AURORA: + return AURORA_GAS_PARAMS } return {} diff --git a/src/common/chainid.ts b/src/common/chainid.ts index 7a238b65..a79dfc16 100644 --- a/src/common/chainid.ts +++ b/src/common/chainid.ts @@ -10,6 +10,7 @@ export namespace ChainId { export const MOONRIVER: number = 1285; export const ARBITRUM: number = 42161; export const AVALANCHE: number = 43114; + export const AURORA: number = 1313161554; export const HARMONY: number = 1666600000; export const asBigNumber = (n: BigNumberish): BigNumber => { @@ -24,7 +25,7 @@ export namespace ChainId { ETH, OPTIMISM, BSC, POLYGON, FANTOM, BOBA, MOONRIVER, ARBITRUM, AVALANCHE, - HARMONY, + AURORA, HARMONY, ] } diff --git a/src/common/networks.ts b/src/common/networks.ts index 6362ed45..e19507ce 100644 --- a/src/common/networks.ts +++ b/src/common/networks.ts @@ -114,6 +114,12 @@ export namespace Networks { chainCurrency: "AVAX", }); + export const AURORA = new Network({ + name: "Aurora", + chainId: ChainId.AURORA, + chainCurrency: "aETH", + }); + export const HARMONY = new Network({ name: "Harmony", chainId: ChainId.HARMONY, @@ -130,6 +136,7 @@ export namespace Networks { [ChainId.MOONRIVER]: MOONRIVER, [ChainId.ARBITRUM]: ARBITRUM, [ChainId.AVALANCHE]: AVALANCHE, + [ChainId.AURORA]: AURORA, [ChainId.HARMONY]: HARMONY, } diff --git a/src/common/synapse_contracts.ts b/src/common/synapse_contracts.ts index 4357cf16..e23f92a5 100644 --- a/src/common/synapse_contracts.ts +++ b/src/common/synapse_contracts.ts @@ -73,6 +73,11 @@ export namespace SynapseContracts { bridge_zap: "0x407Bc506E6F262A0A1F2ea0cC4d66e3bEe29D577", }); + export const Aurora = new SynapseContract({ + bridge: "0xaeD5b25BE1c3163c907a471082640450F928DDFE", + bridge_zap: "0x2D8Ee8d6951cB4Eecfe4a79eb9C2F973C02596Ed", + }); + export const Harmony = new SynapseContract({ bridge: "0xAf41a65F786339e7911F4acDAD6BD49426F2Dc6b", bridge_zap: "0x9354b54dFEa0f70ddAdfdB430f304e1CC4D422ab", diff --git a/src/common/utils.ts b/src/common/utils.ts index 914dfa77..af56b69c 100644 --- a/src/common/utils.ts +++ b/src/common/utils.ts @@ -38,6 +38,7 @@ const CHAINID_CONTRACTS_MAP: {[c: number]: SynapseContracts.SynapseContract} = { [ChainId.MOONRIVER]: SynapseContracts.Moonriver, [ChainId.ARBITRUM]: SynapseContracts.Arbitrum, [ChainId.AVALANCHE]: SynapseContracts.Avalanche, + [ChainId.AURORA]: SynapseContracts.Aurora, [ChainId.HARMONY]: SynapseContracts.Harmony, } diff --git a/src/rpcproviders/uris.ts b/src/rpcproviders/uris.ts index 22072773..5f8f5341 100644 --- a/src/rpcproviders/uris.ts +++ b/src/rpcproviders/uris.ts @@ -4,16 +4,17 @@ import {ChainId} from "../common"; dotenv.config() const - ETH_RPC_URI_ENV: string = "ETH_RPC_URI", - OPTIMISM_RPC_URI_ENV: string = "OPTIMISM_RPC_URI", - BSC_RPC_URI_ENV: string = "BSC_RPC_URI", - POLYGON_RPC_URI_ENV: string = "POLYGON_RPC_URI", - FANTOM_RPC_URI_ENV: string = "FANTOM_RPC_URI", - BOBA_RPC_URI_ENV: string = "BOBA_RPC_URI", + ETH_RPC_URI_ENV: string = "ETH_RPC_URI", + OPTIMISM_RPC_URI_ENV: string = "OPTIMISM_RPC_URI", + BSC_RPC_URI_ENV: string = "BSC_RPC_URI", + POLYGON_RPC_URI_ENV: string = "POLYGON_RPC_URI", + FANTOM_RPC_URI_ENV: string = "FANTOM_RPC_URI", + BOBA_RPC_URI_ENV: string = "BOBA_RPC_URI", MOONRIVER_RPC_URI_ENV: string = "MOONRIVER_RPC_URI", - ARBITRUM_RPC_URI_ENV: string = "ARBITRUM_RPC_URI", + ARBITRUM_RPC_URI_ENV: string = "ARBITRUM_RPC_URI", AVALANCHE_RPC_URI_ENV: string = "AVALANCHE_RPC_URI", - HARMONY_RPC_URI_ENV: string = "HARMONY_RPC_URI"; + AURORA_RPC_URI_ENV: string = "AURORA_RPC_URI", + HARMONY_RPC_URI_ENV: string = "HARMONY_RPC_URI"; const ENV_KEY_MAP: {[c: number]: string} = { @@ -26,6 +27,7 @@ const ENV_KEY_MAP: {[c: number]: string} = { [ChainId.MOONRIVER]: MOONRIVER_RPC_URI_ENV, [ChainId.ARBITRUM]: ARBITRUM_RPC_URI_ENV, [ChainId.AVALANCHE]: AVALANCHE_RPC_URI_ENV, + [ChainId.AURORA]: AURORA_RPC_URI_ENV, [ChainId.HARMONY]: HARMONY_RPC_URI_ENV, } @@ -39,6 +41,7 @@ const CHAIN_RPC_URIS: {[c: number]: string} = { [ChainId.MOONRIVER]: "https://rpc.moonriver.moonbeam.network", [ChainId.ARBITRUM]: "https://arb1.arbitrum.io/rpc", [ChainId.AVALANCHE]: "https://api.avax.network/ext/bc/C/rpc", + [ChainId.AURORA]: "https://mainnet.aurora.dev", [ChainId.HARMONY]: "https://api.harmony.one/", } diff --git a/src/swappools/swappools.ts b/src/swappools/swappools.ts index e4673c7f..9b52cbf4 100644 --- a/src/swappools/swappools.ts +++ b/src/swappools/swappools.ts @@ -314,6 +314,22 @@ export namespace SwapPools { poolTokens: [Tokens.NUSD, Tokens.DAI, Tokens.USDC, Tokens.USDT], }); + export const AURORA_POOL_SWAP_TOKEN = new SwapToken({ + addresses: { + [ChainId.AURORA]: '0xEAdC3524f3F007cdC5104BF28663b1141D3e3127', + }, + decimals: 18, + symbol: 'nUSD-LP', + name: 'Synapse nUSD LP Token Aurora', + poolName: 'Aurora Stableswap Pool ', + poolId: 1, + poolType: 'USD', + swapAddresses: { + [ChainId.AURORA]: '0xcEf6C2e20898C2604886b888552CA6CcF66933B0', + }, + poolTokens: [Tokens.NUSD, Tokens.USDC, Tokens.USDT], + }) + export interface SwapGroupTokenMap { [grp: string]: Token[] } @@ -380,6 +396,10 @@ export namespace SwapPools { [SwapType.ETH]: [...AVALANCHE_ETH_SWAP_TOKEN.poolTokensForBridgeSwaps], [SwapType.OHM]: [Tokens.GOHM], }, + [ChainId.AURORA]: { + [SwapType.USD]: [...AURORA_POOL_SWAP_TOKEN.poolTokensForBridgeSwaps], + [SwapType.SYN]: [Tokens.SYN], + }, [ChainId.HARMONY]: { [SwapType.USD]: [...HARMONY_POOL_SWAP_TOKEN.poolTokensForBridgeSwaps], [SwapType.SYN]: [Tokens.SYN], @@ -454,6 +474,10 @@ export namespace SwapPools { ...nfdPoolTokens, ...ohmPoolTokens, }, + [ChainId.AURORA]: { + [SwapType.USD]: AURORA_POOL_SWAP_TOKEN, + ...synPoolTokens, + }, [ChainId.HARMONY]: { [SwapType.USD]: HARMONY_POOL_SWAP_TOKEN, ...synPoolTokens, diff --git a/src/tokens/tokens.ts b/src/tokens/tokens.ts index a5fa7acb..8ee6b076 100644 --- a/src/tokens/tokens.ts +++ b/src/tokens/tokens.ts @@ -31,7 +31,8 @@ export namespace Tokens { [ChainId.BOBA]: '0xf74195Bb8a5cf652411867c5C2C5b8C2a402be35', [ChainId.ARBITRUM]: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1', [ChainId.AVALANCHE]: '0xd586E7F844cEa2F87f50152665BCbc2C279D8d70', - [ChainId.HARMONY]: '0xef977d2f931c1978db5f6747666fa1eacb0d0339' + [ChainId.AURORA]: '0xe3520349F477A5F6EB06107066048508498A291b', + [ChainId.HARMONY]: '0xef977d2f931c1978db5f6747666fa1eacb0d0339', }, swapType: SwapType.USD }); @@ -57,6 +58,7 @@ export namespace Tokens { [ChainId.BOBA]: 6, [ChainId.AVALANCHE]: 6, [ChainId.ARBITRUM]: 6, + [ChainId.AURORA]: 6, [ChainId.HARMONY]: 6, }, addresses: { @@ -67,7 +69,8 @@ export namespace Tokens { [ChainId.BOBA]: '0x66a2A913e447d6b4BF33EFbec43aAeF87890FBbc', [ChainId.ARBITRUM]: '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8', [ChainId.AVALANCHE]: '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664', - [ChainId.HARMONY]: '0x985458e523db3d53125813ed68c274899e9dfab4' + [ChainId.AURORA]: '0xB12BFcA5A55806AaF64E99521918A4bf0fC40802', + [ChainId.HARMONY]: '0x985458e523db3d53125813ed68c274899e9dfab4', }, swapType: SwapType.USD }); @@ -83,6 +86,7 @@ export namespace Tokens { [ChainId.BOBA]: 6, [ChainId.ARBITRUM]: 6, [ChainId.AVALANCHE]: 6, + [ChainId.AURORA]: 6, [ChainId.HARMONY]: 6, }, addresses: { @@ -93,7 +97,8 @@ export namespace Tokens { [ChainId.BOBA]: '0x5DE1677344D3Cb0D7D465c10b72A8f60699C062d', [ChainId.ARBITRUM]: '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9', [ChainId.AVALANCHE]: '0xc7198437980c041c805a1edcba50c1ce5db95118', - [ChainId.HARMONY]: '0x3c2b8be99c50593081eaa2a724f0b8285f5aba8f' + [ChainId.AURORA]: '0x4988a896b1227218e4A686fdE5EabdcAbd91571f', + [ChainId.HARMONY]: '0x3c2b8be99c50593081eaa2a724f0b8285f5aba8f', }, swapType: SwapType.USD }); @@ -189,7 +194,8 @@ export namespace Tokens { [ChainId.MOONRIVER]: '0xd80d8688b02B3FD3afb81cDb124F188BB5aD0445', [ChainId.ARBITRUM]: '0x080f6aed32fc474dd5717105dba5ea57268f46eb', [ChainId.AVALANCHE]: '0x1f1E7c893855525b303f99bDF5c3c05Be09ca251', - [ChainId.HARMONY]: '0xE55e19Fb4F2D85af758950957714292DAC1e25B2' + [ChainId.AURORA]: '0xd80d8688b02B3FD3afb81cDb124F188BB5aD0445', + [ChainId.HARMONY]: '0xE55e19Fb4F2D85af758950957714292DAC1e25B2', }, swapType: SwapType.SYN }); @@ -209,7 +215,8 @@ export namespace Tokens { [ChainId.BOBA]: '0x6B4712AE9797C199edd44F897cA09BC57628a1CF', [ChainId.ARBITRUM]: '0x2913E812Cf0dcCA30FB28E6Cac3d2DCFF4497688', [ChainId.AVALANCHE]: '0xCFc37A6AB183dd4aED08C204D1c2773c0b1BDf46', - [ChainId.HARMONY]: '0xED2a7edd7413021d440b09D654f3b87712abAB66' + [ChainId.AURORA]: '0x07379565cD8B0CaE7c60Dc78e7f601b34AF2A21c', + [ChainId.HARMONY]: '0xED2a7edd7413021d440b09D654f3b87712abAB66', }, swapType: SwapType.USD, }); @@ -249,8 +256,8 @@ export namespace Tokens { symbol: "HIGH", decimals: 18, addresses: { + [ChainId.ETH]: "0x71Ab77b7dbB4fa7e017BC15090b2163221420282", [ChainId.BSC]: "0x5f4bde007dc06b867f86ebfe4802e34a1ffeed63", - [ChainId.ETH]: "0x71Ab77b7dbB4fa7e017BC15090b2163221420282" }, swapType: SwapType.HIGH }); @@ -284,8 +291,8 @@ export namespace Tokens { decimals: 18, addresses: { [ChainId.BSC]: "0x0fe9778c005a5a6115cbe12b0568a2d50b765a51", // redeem - [ChainId.AVALANCHE]: "0xf1293574ee43950e7a8c9f1005ff097a9a713959", // redeem [ChainId.POLYGON]: "0x0a5926027d407222f8fe20f24cb16e103f617046", // deposit + [ChainId.AVALANCHE]: "0xf1293574ee43950e7a8c9f1005ff097a9a713959", // redeem }, swapType: SwapType.NFD, }); @@ -313,7 +320,7 @@ export namespace Tokens { [ChainId.MOONRIVER]: "0x273508478e099Fdf953349e6B3704E7c3dEE91a5", [ChainId.ARBITRUM]: "0x85662fd123280827e11C59973Ac9fcBE838dC3B4", [ChainId.AVALANCHE]: "0xcc5672600B948dF4b665d9979357bEF3af56B300", - [ChainId.HARMONY]: "0xFa7191D292d5633f702B0bd7E3E3BcCC0e633200", // Coming soon ;) + [ChainId.HARMONY]: "0xFa7191D292d5633f702B0bd7E3E3BcCC0e633200", }, swapType: SwapType.FRAX, }) diff --git a/test/basic/Basic-test.ts b/test/basic/Basic-test.ts index 78331f9c..09311236 100644 --- a/test/basic/Basic-test.ts +++ b/test/basic/Basic-test.ts @@ -12,14 +12,16 @@ import { } from "../../src"; describe("Basic tests", function(this: Mocha.Suite) { + const numChains: number = 11; + describe("Check networks", function(this: Mocha.Suite) { const supportedChains = ChainId.supportedChainIds(), supportedNetworks = Networks.supportedNetworks(); - it("supportedChainIds should return 10 chains", () => expect(supportedChains).to.have.a.lengthOf(10)) + it(`supportedChainIds should return ${numChains} chains`, () => expect(supportedChains).to.have.a.lengthOf(numChains)) - it("supportedNetworks should return 10 networks", () => expect(supportedNetworks).to.have.a.lengthOf(10)) + it(`supportedNetworks should return ${numChains} networks`, () => expect(supportedNetworks).to.have.a.lengthOf(numChains)) }) describe("Check swappableTokens", function(this: Mocha.Suite) { @@ -50,7 +52,7 @@ describe("Basic tests", function(this: Mocha.Suite) { }) describe("Check result of swappableTokensAllNetworks", function(this: Mocha.Suite) { - it("should have 10 map entries", () => expect(Object.keys(resC)).to.have.a.lengthOf(10)) + it(`should have ${numChains} map entries`, () => expect(Object.keys(resC)).to.have.a.lengthOf(numChains)) }) }) }) \ No newline at end of file diff --git a/test/bridge/SynapseBridge-test.ts b/test/bridge/SynapseBridge-test.ts index 01c18076..26d47ff7 100644 --- a/test/bridge/SynapseBridge-test.ts +++ b/test/bridge/SynapseBridge-test.ts @@ -84,41 +84,57 @@ describe("SynapseBridge", function() { }) describe("checkSwapSupported", function(this: Mocha.Suite) { - const makeTestCase = (chainIdFrom: number, tokenFrom: Token, chainIdTo: number, tokenTo: Token, expected: boolean): any => { + interface TestArgs { + chainIdFrom: number, + chainIdTo: number, + tokenFrom: Token, + tokenTo: Token, + } + + interface TestCase { + args: TestArgs, + expected: boolean, + } + + const makeTestCase = (chainIdFrom: number, tokenFrom: Token, chainIdTo: number, tokenTo: Token, expected: boolean): TestCase => { return {args: {chainIdFrom, tokenFrom, chainIdTo, tokenTo}, expected} } - let testCases = [ - makeTestCase(ChainId.ETH, Tokens.DAI, ChainId.BSC, Tokens.USDC, true), - makeTestCase(ChainId.ETH, Tokens.ETH, ChainId.BSC, Tokens.USDC, false), - makeTestCase(ChainId.ARBITRUM, Tokens.WETH, ChainId.ETH, Tokens.ETH, true), - makeTestCase(ChainId.ARBITRUM, Tokens.WETH, ChainId.AVALANCHE, Tokens.ETH, true), - makeTestCase(ChainId.AVALANCHE, Tokens.SYN, ChainId.BSC, Tokens.SYN, true), - makeTestCase(ChainId.POLYGON, Tokens.MIM, ChainId.BSC, Tokens.USDT, false), - makeTestCase(ChainId.FANTOM, Tokens.MIM, ChainId.BSC, Tokens.USDT, true), - makeTestCase(ChainId.BOBA, Tokens.MIM, ChainId.ETH, Tokens.MIM, false), - makeTestCase(ChainId.ETH, Tokens.ETH, ChainId.BOBA, Tokens.NETH, false), - makeTestCase(ChainId.ETH, Tokens.ETH, ChainId.BOBA, Tokens.ETH, false), - makeTestCase(ChainId.BOBA, Tokens.ETH, ChainId.ETH, Tokens.ETH, false), - makeTestCase(ChainId.BOBA, Tokens.ETH, ChainId.ETH, Tokens.NETH, false), - makeTestCase(ChainId.ETH, Tokens.ETH, ChainId.BOBA, Tokens.USDT, false), - makeTestCase(ChainId.ETH, Tokens.NETH, ChainId.BOBA, Tokens.USDC, false), - makeTestCase(ChainId.BOBA, Tokens.ETH, ChainId.ETH, Tokens.USDT, false), - makeTestCase(ChainId.BOBA, Tokens.NETH, ChainId.ETH, Tokens.USDC, false), - makeTestCase(ChainId.BOBA, Tokens.USDC, ChainId.ETH, Tokens.USDT, true), - makeTestCase(ChainId.ETH, Tokens.USDT, ChainId.ETH, Tokens.USDC, true), - makeTestCase(ChainId.BOBA, Tokens.SYN, ChainId.ETH, Tokens.SYN, true), - makeTestCase(ChainId.ETH, Tokens.SYN, ChainId.BOBA, Tokens.SYN, true), - makeTestCase(ChainId.BOBA, Tokens.SYN, ChainId.ETH, Tokens.NUSD, false), - makeTestCase(ChainId.ETH, Tokens.NUSD, ChainId.BOBA, Tokens.NUSD, true), - makeTestCase(ChainId.ETH, Tokens.SYN, ChainId.MOONRIVER, Tokens.SYN, true), - makeTestCase(ChainId.ETH, Tokens.NUSD, ChainId.MOONRIVER, Tokens.FRAX, false), - makeTestCase(ChainId.MOONRIVER, Tokens.FRAX, ChainId.ETH, Tokens.FRAX, true), - makeTestCase(ChainId.ETH, Tokens.FRAX, ChainId.MOONRIVER, Tokens.FRAX, true), - makeTestCase(ChainId.ETH, Tokens.ETH, ChainId.OPTIMISM, Tokens.NETH, true), - makeTestCase(ChainId.ETH, Tokens.ETH, ChainId.OPTIMISM, Tokens.ETH, true), - makeTestCase(ChainId.OPTIMISM, Tokens.ETH, ChainId.ETH, Tokens.ETH, true), - makeTestCase(ChainId.OPTIMISM, Tokens.ETH, ChainId.ETH, Tokens.NETH, true), + let testCases: TestCase[] = [ + makeTestCase(ChainId.ETH, Tokens.DAI, ChainId.BSC, Tokens.USDC, true), + makeTestCase(ChainId.ETH, Tokens.ETH, ChainId.BSC, Tokens.USDC, false), + makeTestCase(ChainId.ARBITRUM, Tokens.WETH, ChainId.ETH, Tokens.ETH, true), + makeTestCase(ChainId.ARBITRUM, Tokens.WETH, ChainId.AVALANCHE, Tokens.ETH, true), + makeTestCase(ChainId.AVALANCHE, Tokens.SYN, ChainId.BSC, Tokens.SYN, true), + makeTestCase(ChainId.POLYGON, Tokens.MIM, ChainId.BSC, Tokens.USDT, false), + makeTestCase(ChainId.FANTOM, Tokens.MIM, ChainId.BSC, Tokens.USDT, true), + makeTestCase(ChainId.BOBA, Tokens.MIM, ChainId.ETH, Tokens.MIM, false), + makeTestCase(ChainId.ETH, Tokens.ETH, ChainId.BOBA, Tokens.NETH, false), + makeTestCase(ChainId.ETH, Tokens.ETH, ChainId.BOBA, Tokens.ETH, false), + makeTestCase(ChainId.BOBA, Tokens.ETH, ChainId.ETH, Tokens.ETH, false), + makeTestCase(ChainId.BOBA, Tokens.ETH, ChainId.ETH, Tokens.NETH, false), + makeTestCase(ChainId.ETH, Tokens.ETH, ChainId.BOBA, Tokens.USDT, false), + makeTestCase(ChainId.ETH, Tokens.NETH, ChainId.BOBA, Tokens.USDC, false), + makeTestCase(ChainId.BOBA, Tokens.ETH, ChainId.ETH, Tokens.USDT, false), + makeTestCase(ChainId.BOBA, Tokens.NETH, ChainId.ETH, Tokens.USDC, false), + makeTestCase(ChainId.BOBA, Tokens.USDC, ChainId.ETH, Tokens.USDT, true), + makeTestCase(ChainId.ETH, Tokens.USDT, ChainId.ETH, Tokens.USDC, true), + makeTestCase(ChainId.BOBA, Tokens.SYN, ChainId.ETH, Tokens.SYN, true), + makeTestCase(ChainId.ETH, Tokens.SYN, ChainId.BOBA, Tokens.SYN, true), + makeTestCase(ChainId.BOBA, Tokens.SYN, ChainId.ETH, Tokens.NUSD, false), + makeTestCase(ChainId.ETH, Tokens.NUSD, ChainId.BOBA, Tokens.NUSD, true), + makeTestCase(ChainId.ETH, Tokens.SYN, ChainId.MOONRIVER, Tokens.SYN, true), + makeTestCase(ChainId.ETH, Tokens.NUSD, ChainId.MOONRIVER, Tokens.FRAX, false), + makeTestCase(ChainId.MOONRIVER, Tokens.FRAX, ChainId.ETH, Tokens.FRAX, true), + makeTestCase(ChainId.ETH, Tokens.FRAX, ChainId.MOONRIVER, Tokens.FRAX, true), + makeTestCase(ChainId.ETH, Tokens.ETH, ChainId.OPTIMISM, Tokens.NETH, true), + makeTestCase(ChainId.ETH, Tokens.ETH, ChainId.OPTIMISM, Tokens.ETH, true), + makeTestCase(ChainId.OPTIMISM, Tokens.ETH, ChainId.ETH, Tokens.ETH, true), + makeTestCase(ChainId.OPTIMISM, Tokens.ETH, ChainId.ETH, Tokens.NETH, true), + makeTestCase(ChainId.AURORA, Tokens.USDT, ChainId.BSC, Tokens.USDC, true), + makeTestCase(ChainId.ETH, Tokens.ETH, ChainId.AURORA, Tokens.USDC, false), + makeTestCase(ChainId.ETH, Tokens.NETH, ChainId.AURORA, Tokens.USDC, false), + makeTestCase(ChainId.AVALANCHE, Tokens.WETH_E, ChainId.AURORA, Tokens.USDC, false), ]; testCases.forEach(({ args, expected }) => { @@ -147,7 +163,21 @@ describe("SynapseBridge", function() { describe("getEstimatedBridgeOutput", function(this: Mocha.Suite) { this.timeout(30*1000); - const makeSimpleTestCase = (amt: string): any => { + interface TestArgs { + chainIdFrom: number, + chainIdTo: number, + tokenFrom: Token, + tokenTo: Token, + amountFrom: BigNumber, + } + + interface TestCase { + args: TestArgs, + notZero: boolean, + wantError: boolean, + } + + const makeSimpleTestCase = (amt: string): TestArgs => { return { chainIdFrom: ChainId.ETH, tokenFrom: Tokens.DAI, @@ -157,7 +187,7 @@ describe("SynapseBridge", function() { } } - let testCases = [ + let testCases: TestCase[] = [ { args: makeSimpleTestCase("500"), notZero: true, @@ -448,6 +478,61 @@ describe("SynapseBridge", function() { notZero: true, wantError: false, }, + { + args: { + chainIdFrom: ChainId.AURORA, + chainIdTo: ChainId.AVALANCHE, + tokenFrom: Tokens.USDC, + tokenTo: Tokens.USDC, + amountFrom: Tokens.USDC.valueToWei("69", ChainId.AURORA), + }, + notZero: true, + wantError: false, + }, + { + args: { + chainIdFrom: ChainId.BSC, + chainIdTo: ChainId.AURORA, + tokenFrom: Tokens.USDC, + tokenTo: Tokens.NUSD, + amountFrom: Tokens.USDC.valueToWei("69", ChainId.BSC), + }, + notZero: true, + wantError: false, + }, + { + args: { + chainIdFrom: ChainId.AURORA, + chainIdTo: ChainId.ETH, + tokenFrom: Tokens.USDC, + tokenTo: Tokens.NUSD, + amountFrom: Tokens.USDC.valueToWei("69", ChainId.AURORA), + }, + notZero: false, + wantError: false, + }, + { + args: { + chainIdFrom: ChainId.AURORA, + chainIdTo: ChainId.ETH, + tokenFrom: Tokens.USDC, + tokenTo: Tokens.NUSD, + amountFrom: Tokens.USDC.valueToWei("669", ChainId.AURORA), + }, + notZero: true, + wantError: false, + }, + { + args: { + chainIdFrom: ChainId.ETH, + chainIdTo: ChainId.AURORA, + tokenFrom: Tokens.USDC, + tokenTo: Tokens.NUSD, + amountFrom: Tokens.USDC.valueToWei("669", ChainId.ETH), + }, + notZero: true, + wantError: false, + }, ]; testCases.forEach(({ args, notZero, wantError }) => { diff --git a/test/bridge/slippages-test.ts b/test/bridge/slippages-test.ts index 5d60e2b8..496cfe0b 100644 --- a/test/bridge/slippages-test.ts +++ b/test/bridge/slippages-test.ts @@ -2,23 +2,42 @@ import { BigNumber } from "@ethersproject/bignumber"; import { expect } from "chai"; import { Slippages } from "../../src"; +import {BigNumberish} from "ethers"; describe("Slippages tests", function(this: Mocha.Suite) { - describe("_applySlippage", function(this: Mocha.Suite) { - it("value of 69420 with 1% slippage should return 68725", () => { - const ret = Slippages._applySlippage(BigNumber.from(69420), "foo"); - // This should default to 1% slippage -> (value - value * 0.01). - expect(ret._hex).to.equal(BigNumber.from(68725)._hex); - }) + interface TestCase { + func: (BigNumber, string) => BigNumber, + value: BigNumber, + slippage: string, + expected: BigNumber, + } - it("value of 1337 with TWO_TENTH slippage should return 1334", () => { - const ret = Slippages._applySlippage(BigNumber.from(1337), "TWO_TENTH"); - expect(ret._hex).to.equal(BigNumber.from(1334)._hex); - }) + describe("_applySlippage", function(this: Mocha.Suite) { + const makeTitle = (tc: TestCase): string => `value of ${tc.value.toString()} with slippage of ${tc.slippage} should return ${tc.expected.toString()}` - it("value of 101 with QUARTER slippage should return 98", () => { - const ret = Slippages._applySlippage(BigNumber.from(101), Slippages.Quarter); - expect(ret._hex).to.equal(BigNumber.from(98)._hex); + let testCases: TestCase[] = [ + { + func: Slippages._applySlippage, + value: BigNumber.from(69420), + slippage: "foo", // This should default to 1% slippage -> (value - value * 0.01). + expected: BigNumber.from(68725), + }, + { + func: Slippages._applySlippage, + value: BigNumber.from(1337), + slippage: "TWO_TENTH", + expected: BigNumber.from(1334), + }, + { + func: Slippages._applySlippage, + value: BigNumber.from(101), + slippage: Slippages.Quarter, + expected: BigNumber.from(98), + } + ] + + testCases.forEach((tc: TestCase) => { + it(makeTitle(tc), () => expect(tc.func(tc.value, tc.slippage)._hex).to.equal(tc.expected._hex)) }) }) @@ -34,24 +53,24 @@ describe("Slippages tests", function(this: Mocha.Suite) { }) describe("formatSlippageToString", function(this: Mocha.Suite) { - it("Slippages.One should return 1.0", () => { - expect(Slippages.formatSlippageToString(Slippages.One)).to.equal("1.0"); - }) + it("Slippages.One should return 1.0", () => + expect(Slippages.formatSlippageToString(Slippages.One)).to.equal("1.0") + ) - it("Slippages.OneTenth should return 0.1", () => { - expect(Slippages.formatSlippageToString(Slippages.OneTenth)).to.equal("0.1"); - }) + it("Slippages.OneTenth should return 0.1", () => + expect(Slippages.formatSlippageToString(Slippages.OneTenth)).to.equal("0.1") + ) - it("Slippages.TwoTenth should return 0.2", () => { - expect(Slippages.formatSlippageToString(Slippages.TwoTenth)).to.equal("0.2"); - }) + it("Slippages.TwoTenth should return 0.2", () => + expect(Slippages.formatSlippageToString(Slippages.TwoTenth)).to.equal("0.2") + ) - it("Slippages.Quarter should return 2.0", () => { - expect(Slippages.formatSlippageToString(Slippages.Quarter)).to.equal("2.0"); - }) + it("Slippages.Quarter should return 2.0", () => + expect(Slippages.formatSlippageToString(Slippages.Quarter)).to.equal("2.0") + ) - it("foo should return N/A", () => { - expect(Slippages.formatSlippageToString("foo")).to.equal("N/A"); - }) + it("foo should return N/A", () => + expect(Slippages.formatSlippageToString("foo")).to.equal("N/A") + ) }) })