diff --git a/.changeset/plenty-cooks-fix.md b/.changeset/plenty-cooks-fix.md new file mode 100644 index 00000000..d2524f1c --- /dev/null +++ b/.changeset/plenty-cooks-fix.md @@ -0,0 +1,5 @@ +--- +'@protocolink/api': patch +--- + +add Spark test diff --git a/.changeset/sour-terms-call.md b/.changeset/sour-terms-call.md new file mode 100644 index 00000000..fe770734 --- /dev/null +++ b/.changeset/sour-terms-call.md @@ -0,0 +1,5 @@ +--- +'@protocolink/api': patch +--- + +add Permit2 test diff --git a/packages/api/examples/permit2/pull-token.ts b/packages/api/examples/permit2/pull-token.ts new file mode 100644 index 00000000..46ee5c27 --- /dev/null +++ b/packages/api/examples/permit2/pull-token.ts @@ -0,0 +1,36 @@ +import * as api from '@protocolink/api'; + +// interface PullTokenFields { +// input: { +// token: { +// chainId: number; +// address: string; +// decimals: number; +// symbol: string; +// name: string; +// }; +// amount: string; +// }; +// } + +// interface PullTokenLogic { +// rid: string; +// fields: PullTokenFields; +// } + +(async () => { + const chainId = 1; + + const tokenList = await api.protocols.permit2.getPullTokenTokenList(chainId); + const tokenIn = tokenList[0]; + console.log('tokenIn :>> ', JSON.stringify(tokenIn, null, 2)); + + const pullTokenLogic = await api.protocols.permit2.newPullTokenLogic({ + input: { + token: tokenIn, + amount: '10', + }, + }); + + console.log('pullTokenLogic :>> ', JSON.stringify(pullTokenLogic, null, 2)); +})(); diff --git a/packages/api/examples/spark/borrow.ts b/packages/api/examples/spark/borrow.ts new file mode 100644 index 00000000..cd5548c8 --- /dev/null +++ b/packages/api/examples/spark/borrow.ts @@ -0,0 +1,38 @@ +import * as api from '@protocolink/api'; +import * as logics from '@protocolink/logics'; + +// interface BorrowFields { +// interestRateMode: logics.spark.InterestRateMode; +// output: { +// token: { +// chainId: number; +// address: string; +// decimals: number; +// symbol: string; +// name: string; +// }; +// amount: string; +// }; +// } + +// interface BorrowLogic { +// rid: string; +// fields: BorrowFields; +// } + +(async () => { + const chainId = 1; + + const tokenList = await api.protocols.spark.getBorrowTokenList(chainId); + const underlyingToken = tokenList[0]; + console.log('underlyingToken :>> ', JSON.stringify(underlyingToken, null, 2)); + + const borrowLogic = await api.protocols.spark.newBorrowLogic({ + interestRateMode: logics.spark.InterestRateMode.variable, + output: { + token: underlyingToken, + amount: '10', + }, + }); + console.log('borrowLogic :>> ', JSON.stringify(borrowLogic, null, 2)); +})(); diff --git a/packages/api/examples/spark/flash-loan.ts b/packages/api/examples/spark/flash-loan.ts new file mode 100644 index 00000000..69179f5e --- /dev/null +++ b/packages/api/examples/spark/flash-loan.ts @@ -0,0 +1,52 @@ +import * as api from '@protocolink/api'; + +// import * as common from '@protocolink/common'; + +// interface FlashLoanLogicFields { +// id: string; +// outputs: common.TokenAmounts; +// isLoan: boolean; +// } + +// interface FlashLoanFields { +// id: string; +// outputs: { +// token: { +// chainId: number; +// address: string; +// decimals: number; +// symbol: string; +// name: string; +// }; +// amount: string; +// }[]; +// isLoan: boolean; +// } + +// interface FlashLoanLogic { +// rid: string; +// fields: FlashLoanFields; +// } + +(async () => { + const chainId = 1; + + const tokenList = await api.protocols.spark.getFlashLoanTokenList(chainId); + const underlyingToken = tokenList[0]; + console.log('underlyingToken :>> ', JSON.stringify(underlyingToken, null, 2)); + + const outputs = [ + { + token: underlyingToken, + amount: '10000', + }, + ]; + + const [flashLoanLoanLogic, flashLoanRepayLogic] = api.protocols.spark.newFlashLoanLogicPair(outputs); + const logics = [flashLoanLoanLogic]; + // logics.push(swapLogic) + // logics.push(supplyLogic) + // logics.push(...) + logics.push(flashLoanRepayLogic); + console.log('logics :>> ', JSON.stringify(logics, null, 2)); +})(); diff --git a/packages/api/examples/spark/repay.ts b/packages/api/examples/spark/repay.ts new file mode 100644 index 00000000..b7bd5b01 --- /dev/null +++ b/packages/api/examples/spark/repay.ts @@ -0,0 +1,53 @@ +import * as api from '@protocolink/api'; +import * as logics from '@protocolink/logics'; + +// interface RepayParams { +// tokenIn: { +// chainId: number; +// address: string; +// decimals: number; +// symbol: string; +// name: string; +// }; +// borrower: string; +// interestRateMode: logics.spark.InterestRateMode; +// } + +// interface RepayFields { +// input: { +// token: { +// chainId: number; +// address: string; +// decimals: number; +// symbol: string; +// name: string; +// }; +// amount: string; +// }; +// borrower: string; +// interestRateMode: logics.spark.InterestRateMode; +// } + +// interface RepayLogic { +// rid: string; +// fields: RepayFields; +// } + +(async () => { + const chainId = 1; + const account = '0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa'; + + const tokenList = await api.protocols.spark.getRepayTokenList(chainId); + const underlyingToken = tokenList[0]; + console.log('underlyingToken :>> ', JSON.stringify(underlyingToken, null, 2)); + + const repayQuotation = await api.protocols.spark.getRepayQuotation(chainId, { + borrower: account, + tokenIn: underlyingToken, + interestRateMode: logics.spark.InterestRateMode.variable, + }); + console.log('repayQuotation :>> ', JSON.stringify(repayQuotation, null, 2)); + + const repayLogic = await api.protocols.spark.newRepayLogic(repayQuotation); + console.log('repayLogic :>> ', JSON.stringify(repayLogic, null, 2)); +})(); diff --git a/packages/api/examples/spark/supply.ts b/packages/api/examples/spark/supply.ts new file mode 100644 index 00000000..c0214db0 --- /dev/null +++ b/packages/api/examples/spark/supply.ts @@ -0,0 +1,71 @@ +import * as api from '@protocolink/api'; + +// interface SupplyParams { +// input: { +// token: { +// chainId: number; +// address: string; +// decimals: number; +// symbol: string; +// name: string; +// }; +// amount: string; +// }; +// tokenOut: { +// chainId: number; +// address: string; +// decimals: number; +// symbol: string; +// name: string; +// }; +// } + +// interface SupplyFields { +// input: { +// token: { +// chainId: number; +// address: string; +// decimals: number; +// symbol: string; +// name: string; +// }; +// amount: string; +// }; +// output: { +// token: { +// chainId: number; +// address: string; +// decimals: number; +// symbol: string; +// name: string; +// }; +// amount: string; +// }; +// } + +// interface SupplyLogic { +// rid: string; +// fields: SupplyFields; +// } + +(async () => { + const chainId = 1; + + const tokenList = await api.protocols.spark.getSupplyTokenList(chainId); + const underlyingToken = tokenList[0][0]; + const aToken = tokenList[0][1]; + console.log('underlyingToken :>> ', JSON.stringify(underlyingToken, null, 2)); + console.log('aToken :>> ', JSON.stringify(aToken, null, 2)); + + const supplyQuotation = await api.protocols.spark.getSupplyQuotation(chainId, { + input: { + token: underlyingToken, + amount: '10', + }, + tokenOut: aToken, + }); + console.log('supplyQuotation :>> ', JSON.stringify(supplyQuotation, null, 2)); + + const supplyLogic = await api.protocols.spark.newSupplyLogic(supplyQuotation); + console.log('supplyLogic :>> ', JSON.stringify(supplyLogic, null, 2)); +})(); diff --git a/packages/api/examples/spark/withdraw.ts b/packages/api/examples/spark/withdraw.ts new file mode 100644 index 00000000..91480e7f --- /dev/null +++ b/packages/api/examples/spark/withdraw.ts @@ -0,0 +1,71 @@ +import * as api from '@protocolink/api'; + +// interface WithdrawParams { +// input: { +// token: { +// chainId: number; +// address: string; +// decimals: number; +// symbol: string; +// name: string; +// }; +// amount: string; +// }; +// tokenOut: { +// chainId: number; +// address: string; +// decimals: number; +// symbol: string; +// name: string; +// }; +// } + +// interface WithdrawFields { +// input: { +// token: { +// chainId: number; +// address: string; +// decimals: number; +// symbol: string; +// name: string; +// }; +// amount: string; +// }; +// output: { +// token: { +// chainId: number; +// address: string; +// decimals: number; +// symbol: string; +// name: string; +// }; +// amount: string; +// }; +// } + +// interface WithdrawLogic { +// rid: string; +// fields: WithdrawFields; +// } + +(async () => { + const chainId = 1; + + const tokenList = await api.protocols.spark.getWithdrawTokenList(chainId); + const aToken = tokenList[0][0]; + const underlyingToken = tokenList[0][1]; + console.log('aToken :>> ', JSON.stringify(aToken, null, 2)); + console.log('underlyingToken :>> ', JSON.stringify(underlyingToken, null, 2)); + + const withdrawQuotation = await api.protocols.spark.getWithdrawQuotation(chainId, { + input: { + token: aToken, + amount: '10', + }, + tokenOut: underlyingToken, + }); + console.log('withdrawQuotation :>> ', JSON.stringify(withdrawQuotation, null, 2)); + + const withdrawLogic = await api.protocols.spark.newWithdrawLogic(withdrawQuotation); + console.log('withdrawLogic :>> ', JSON.stringify(withdrawLogic, null, 2)); +})(); diff --git a/packages/api/src/protocols/permit2/pull-token.test.ts b/packages/api/src/protocols/permit2/pull-token.test.ts new file mode 100644 index 00000000..0280272e --- /dev/null +++ b/packages/api/src/protocols/permit2/pull-token.test.ts @@ -0,0 +1,15 @@ +import * as common from '@protocolink/common'; +import { expect } from 'chai'; +import { getPullTokenTokenList } from './pull-token'; +import * as logics from '@protocolink/logics'; + +describe('Permit2 PullTokenLogic', function () { + context('Test getTokenList', async function () { + logics.permit2.PullTokenLogic.supportedChainIds.forEach((chainId) => { + it(`network: ${common.toNetworkId(chainId)}`, async function () { + const tokenList = await getPullTokenTokenList(chainId); + expect(tokenList).to.have.lengthOf.above(0); + }); + }); + }); +}); diff --git a/packages/api/src/protocols/spark/borrow.test.ts b/packages/api/src/protocols/spark/borrow.test.ts new file mode 100644 index 00000000..8456a0a4 --- /dev/null +++ b/packages/api/src/protocols/spark/borrow.test.ts @@ -0,0 +1,15 @@ +import * as common from '@protocolink/common'; +import { expect } from 'chai'; +import { getBorrowTokenList } from './borrow'; +import * as logics from '@protocolink/logics'; + +describe('Spark BorrowLogic', function () { + context('Test getTokenList', async function () { + logics.spark.BorrowLogic.supportedChainIds.forEach((chainId) => { + it(`network: ${common.toNetworkId(chainId)}`, async function () { + const tokenList = await getBorrowTokenList(chainId); + expect(tokenList).to.have.lengthOf.above(0); + }); + }); + }); +}); diff --git a/packages/api/src/protocols/spark/flash-loan.test.ts b/packages/api/src/protocols/spark/flash-loan.test.ts new file mode 100644 index 00000000..15df4233 --- /dev/null +++ b/packages/api/src/protocols/spark/flash-loan.test.ts @@ -0,0 +1,53 @@ +import { FlashLoanParams, getFlashLoanQuotation, getFlashLoanTokenList } from './flash-loan'; +import * as common from '@protocolink/common'; +import { expect } from 'chai'; +import * as logics from '@protocolink/logics'; + +describe('Spark FlashLoanLogic', function () { + context('Test getTokenList', async function () { + logics.spark.FlashLoanLogic.supportedChainIds.forEach((chainId) => { + it(`network: ${common.toNetworkId(chainId)}`, async function () { + const tokenList = await getFlashLoanTokenList(chainId); + expect(tokenList).to.have.lengthOf.above(0); + }); + }); + }); + + context('Test getQuotation', async function () { + const chainId = common.ChainId.mainnet; + + const testCases: FlashLoanParams[] = [ + { + loans: [ + { token: logics.spark.mainnetTokens.WETH, amount: '1' }, + { token: logics.spark.mainnetTokens.USDC, amount: '1' }, + ], + }, + { + repays: [ + { token: logics.spark.mainnetTokens.WETH, amount: '1' }, + { token: logics.spark.mainnetTokens.USDC, amount: '1' }, + ], + }, + { + loans: [ + { token: logics.spark.mainnetTokens.WBTC, amount: '1' }, + { token: logics.spark.mainnetTokens.DAI, amount: '1' }, + ], + }, + { + repays: [ + { token: logics.spark.mainnetTokens.WBTC, amount: '1' }, + { token: logics.spark.mainnetTokens.DAI, amount: '1' }, + ], + }, + ]; + + testCases.forEach((params, i) => { + it(`case ${i + 1}`, async function () { + const quotation = await getFlashLoanQuotation(chainId, params); + expect(quotation).to.include.all.keys('loans', 'repays', 'feeBps'); + }); + }); + }); +}); diff --git a/packages/api/src/protocols/spark/repay.test.ts b/packages/api/src/protocols/spark/repay.test.ts new file mode 100644 index 00000000..7b21aedc --- /dev/null +++ b/packages/api/src/protocols/spark/repay.test.ts @@ -0,0 +1,39 @@ +import { RepayParams, getRepayQuotation, getRepayTokenList } from './repay'; +import * as common from '@protocolink/common'; +import { expect } from 'chai'; +import * as logics from '@protocolink/logics'; + +describe('Spark RepayLogic', function () { + context('Test getTokenList', async function () { + logics.spark.RepayLogic.supportedChainIds.forEach((chainId) => { + it(`network: ${common.toNetworkId(chainId)}`, async function () { + const tokenList = await getRepayTokenList(chainId); + expect(tokenList).to.have.lengthOf.above(0); + }); + }); + }); + + context('Test getQuotation', async function () { + const chainId = common.ChainId.mainnet; + + const testCases: RepayParams[] = [ + { + borrower: '0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa', + interestRateMode: logics.spark.InterestRateMode.variable, + tokenIn: logics.spark.mainnetTokens.ETH, + }, + { + borrower: '0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa', + interestRateMode: logics.spark.InterestRateMode.variable, + tokenIn: logics.spark.mainnetTokens.USDC, + }, + ]; + + testCases.forEach((params, i) => { + it(`case ${i + 1}`, async function () { + const quotation = await getRepayQuotation(chainId, params); + expect(quotation).to.include.all.keys('borrower', 'interestRateMode', 'input'); + }); + }); + }); +}); diff --git a/packages/api/src/protocols/spark/supply.test.ts b/packages/api/src/protocols/spark/supply.test.ts new file mode 100644 index 00000000..cec366e1 --- /dev/null +++ b/packages/api/src/protocols/spark/supply.test.ts @@ -0,0 +1,37 @@ +import { SupplyParams, getSupplyQuotation, getSupplyTokenList } from './supply'; +import * as common from '@protocolink/common'; +import { expect } from 'chai'; +import * as logics from '@protocolink/logics'; + +describe('Spark SupplyLogic', function () { + context('Test getTokenList', async function () { + logics.spark.SupplyLogic.supportedChainIds.forEach((chainId) => { + it(`network: ${common.toNetworkId(chainId)}`, async function () { + const tokenList = await getSupplyTokenList(chainId); + expect(tokenList).to.have.lengthOf.above(0); + }); + }); + }); + + context('Test getQuotation', async function () { + const chainId = common.ChainId.mainnet; + + const testCases: SupplyParams[] = [ + { + input: { token: logics.spark.mainnetTokens.ETH, amount: '1' }, + tokenOut: logics.spark.mainnetTokens.spWETH, + }, + { + input: { token: logics.spark.mainnetTokens.USDC, amount: '1' }, + tokenOut: logics.spark.mainnetTokens.spUSDC, + }, + ]; + + testCases.forEach((params, i) => { + it(`case ${i + 1}`, async function () { + const quotation = await getSupplyQuotation(chainId, params); + expect(quotation).to.include.all.keys('input', 'output'); + }); + }); + }); +}); diff --git a/packages/api/src/protocols/spark/withdraw.test.ts b/packages/api/src/protocols/spark/withdraw.test.ts new file mode 100644 index 00000000..7b00d0f4 --- /dev/null +++ b/packages/api/src/protocols/spark/withdraw.test.ts @@ -0,0 +1,37 @@ +import { WithdrawParams, getWithdrawQuotation, getWithdrawTokenList } from './withdraw'; +import * as common from '@protocolink/common'; +import { expect } from 'chai'; +import * as logics from '@protocolink/logics'; + +describe('Spark WithdrawLogic', function () { + context('Test getTokenList', async function () { + logics.spark.WithdrawLogic.supportedChainIds.forEach((chainId) => { + it(`network: ${common.toNetworkId(chainId)}`, async function () { + const tokenList = await getWithdrawTokenList(chainId); + expect(tokenList).to.have.lengthOf.above(0); + }); + }); + }); + + context('Test getQuotation', async function () { + const chainId = common.ChainId.mainnet; + + const testCases: WithdrawParams[] = [ + { + input: { token: logics.spark.mainnetTokens.spWETH, amount: '1' }, + tokenOut: logics.spark.mainnetTokens.ETH, + }, + { + input: { token: logics.spark.mainnetTokens.spUSDC, amount: '1' }, + tokenOut: logics.spark.mainnetTokens.USDC, + }, + ]; + + testCases.forEach((params, i) => { + it(`case ${i + 1}`, async function () { + const quotation = await getWithdrawQuotation(chainId, params); + expect(quotation).to.include.all.keys('input', 'output'); + }); + }); + }); +});