@brian-ai/ee-portals-solver
Version:
> ⚠️ README: work in progress.
209 lines (194 loc) • 6.3 kB
text/typescript
import { describe, expect, test } from "bun:test";
import { PortalsSolver } from "../src";
import { parseUnits, type Hex } from "viem";
import {
arbitrum,
avalanche,
base,
bsc,
gnosis,
mainnet,
mode,
optimism,
polygon,
} from "viem/chains";
describe("[portals-solver] tests", () => {
const chains = [
{
id: 1,
chain: mainnet,
},
{
id: 43114,
chain: avalanche,
},
{
id: 137,
chain: polygon,
},
{
id: 56,
chain: bsc,
},
{
id: 10,
chain: optimism,
},
{
id: 42161,
chain: arbitrum,
},
{
id: 100,
chain: gnosis,
},
{
id: 8453,
chain: base,
},
{
chain: mode,
id: 34443,
},
];
const portalsSolver = new PortalsSolver(
chains.map((chain) => chain.id),
"https://api.portals.fi/v2",
process.env.PORTALS_API_KEY!,
"0x129B480AD625bcD1A5c3A1C10d708114726Fa467",
0.1,
0.5
);
const usdcTokenMap: Record<number, Hex> = {
1: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
56: "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",
43114: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",
10: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
42161: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
100: "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83",
137: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
324: "0x3355df6D4c9C3035724Fd0e3914dE96A5a83aaf4",
8453: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
59144: "0x176211869cA2b568f2A7D4EE941E073a821EE1ff",
5000: "0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9",
534352: "0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4",
34443: "0xd988097fb8612cc24eec14542bc03424c656005f",
};
const aaveUsdcTokenMap: Record<number, Hex> = {
1: "0x98C23E9d8f34FEFb1B7BD6a91B7FF122F4e16F5c",
42161: "0x625E7708f30cA75bfd92586e17077590C60eb4cD",
10: "0x625E7708f30cA75bfd92586e17077590C60eb4cD",
43114: "0x625E7708f30cA75bfd92586e17077590C60eb4cD",
137: "0x625E7708f30cA75bfd92586e17077590C60eb4cD",
8453: "0x0a1d576f3eFeF75b330424287a95A366e8281D54",
};
const aaveChains = [
{
id: 1,
chain: mainnet,
},
{
id: 42161,
chain: arbitrum,
},
{
id: 10,
chain: optimism,
},
{
id: 137,
chain: polygon,
},
{
id: 8453,
chain: base,
},
{
id: 43114,
chain: avalanche,
},
];
const nativeTokenMap: Record<number, Hex> = {
1: "0x0000000000000000000000000000000000000000",
56: "0x0000000000000000000000000000000000000000",
43114: "0x0000000000000000000000000000000000000000",
10: "0x0000000000000000000000000000000000000000",
42161: "0x0000000000000000000000000000000000000000",
100: "0x0000000000000000000000000000000000000000",
137: "0x0000000000000000000000000000000000000000",
8453: "0x0000000000000000000000000000000000000000",
34443: "0x0000000000000000000000000000000000000000",
};
describe("swap tests", async () => {
for (const sourceChain of chains) {
// on only one chain swap USDC to ETH and viceversa
test(`should return a swap transaction on ${sourceChain.chain.name} from USDC to ETH`, async () => {
const result = await portalsSolver.execute("swap", {
chain: sourceChain.chain,
inputToken: usdcTokenMap[sourceChain.id],
outputToken: nativeTokenMap[sourceChain.id],
amount: parseUnits("6", 6),
receiver: "0x02489791e27a36b9C314c2c70d9d4103eB5ba415",
address: "0x02489791e27a36b9C314c2c70d9d4103eB5ba415",
});
expect(result).toBeDefined();
expect(result.type).toBe("write");
expect(result.solver).toBe("portals");
expect(result.data).toBeDefined();
expect(result.data.length).toBeGreaterThan(0);
});
test(`should return a swap transaction on ${sourceChain.chain.name} from ETH to USDC`, async () => {
const result = await portalsSolver.execute("swap", {
chain: sourceChain.chain,
inputToken: nativeTokenMap[sourceChain.id],
outputToken: usdcTokenMap[sourceChain.id],
amount: parseUnits("6", 18),
receiver: "0x02489791e27a36b9C314c2c70d9d4103eB5ba415",
address: "0x02489791e27a36b9C314c2c70d9d4103eB5ba415",
});
expect(result).toBeDefined();
expect(result.type).toBe("write");
expect(result.solver).toBe("portals");
expect(result.data).toBeDefined();
});
}
});
describe("deposit tests", async () => {
for (const sourceChain of aaveChains) {
test(`should return a aave deposit transaction on ${sourceChain.chain.name} from USDC to aave USDC`, async () => {
const result = await portalsSolver.execute("deposit", {
chain: sourceChain.chain,
inputToken: usdcTokenMap[sourceChain.id],
outputToken: aaveUsdcTokenMap[sourceChain.id],
amount: parseUnits("6", 6),
receiver: "0x02489791e27a36b9C314c2c70d9d4103eB5ba415",
address: "0x02489791e27a36b9C314c2c70d9d4103eB5ba415",
});
expect(result).toBeDefined();
expect(result.type).toBe("write");
expect(result.solver).toBe("portals");
expect(result.data).toBeDefined();
expect(result.data.length).toBeGreaterThan(0);
});
}
});
describe("withdraw tests", async () => {
for (const sourceChain of aaveChains) {
test(`should return a aave withdraw transaction on ${sourceChain.chain.name} from aave USDC to USDC`, async () => {
const result = await portalsSolver.execute("withdraw", {
chain: sourceChain.chain,
inputToken: aaveUsdcTokenMap[sourceChain.id],
outputToken: usdcTokenMap[sourceChain.id],
amount: parseUnits("6", 6),
receiver: "0x02489791e27a36b9C314c2c70d9d4103eB5ba415",
address: "0x02489791e27a36b9C314c2c70d9d4103eB5ba415",
});
expect(result).toBeDefined();
expect(result.type).toBe("write");
expect(result.solver).toBe("portals");
expect(result.data).toBeDefined();
expect(result.data.length).toBeGreaterThan(0);
});
}
});
});