Skip to content

Commit c0f89ac

Browse files
authored
Impl interface (#1214)
* Improve interface of positionsCreateWithArbitraryTokens * rename * 8.1.0
1 parent 246ee27 commit c0f89ac

File tree

4 files changed

+171
-166
lines changed

4 files changed

+171
-166
lines changed

lib/agent/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export { positionsCreate } from './positionsCreate'
22
export { positionsCreateWithEth } from './positionsCreateWithEth'
33
export { positionsCreateWithEth as positionsCreateWithEthForPolygon } from './positionsCreateWithEthForPolygon'
4-
export { positionsCreateWithArbitraryTokens } from './positionsCreateWithArbitraryTokens'
4+
export { positionsCreateWithAnyTokens } from './positionsCreateWithAnyTokens'
55
export { estimationsAPY } from './estimationsAPY'
66
export { propertiesAssets } from './propertiesAssets'
77

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
/* eslint-disable functional/functional-parameters */
2+
import { FallbackableOverrides } from '../common/utils/execute'
3+
import { clientsUtilsSwapTokensForStake } from './common/clients/clientsUtilsSwapTokensForStake'
4+
import { ZeroAddress, type ContractRunner, TransactionResponse } from 'ethers'
5+
import {
6+
approveIfNeeded,
7+
ApproveIfNeededResult,
8+
} from './common/approveIfNeeded'
9+
import { UndefinedOr, whenDefined } from '@devprotocol/util-ts'
10+
11+
type Params = {
12+
readonly provider: ContractRunner
13+
readonly mintTo: string
14+
readonly destination: string
15+
readonly path: readonly (string | bigint)[]
16+
readonly token?: undefined
17+
readonly tokenAmount?: string
18+
readonly devAmount?: string
19+
readonly devAmountOut?: string
20+
readonly from?: string
21+
readonly overrides?: FallbackableOverrides
22+
readonly payload?: string
23+
readonly deadline?: number
24+
readonly gatewayAddress?: string
25+
readonly gatewayBasisPoints?: number
26+
}
27+
28+
type ParamsWithToken = Omit<Params, 'token'> & {
29+
readonly token: string
30+
}
31+
32+
const hasTokens = (
33+
options: Params | ParamsWithToken,
34+
): options is ParamsWithToken =>
35+
options.token !== undefined && options.token !== ZeroAddress
36+
37+
export function positionsCreateWithAnyTokens(opts: ParamsWithToken): Promise<
38+
UndefinedOr<{
39+
readonly estimatedDev: string
40+
readonly estimatedTokens: string
41+
readonly create: () => Promise<ApproveIfNeededResult>
42+
}>
43+
>
44+
export function positionsCreateWithAnyTokens(opts: Params): Promise<
45+
UndefinedOr<{
46+
readonly estimatedDev: string
47+
readonly estimatedTokens: string
48+
readonly create: () => Promise<TransactionResponse>
49+
}>
50+
>
51+
52+
export async function positionsCreateWithAnyTokens(
53+
options: ParamsWithToken | Params,
54+
): Promise<unknown> {
55+
const [, cont] = await clientsUtilsSwapTokensForStake(options.provider)
56+
const useERC20 = hasTokens(options)
57+
58+
return cont
59+
? {
60+
estimatedDev: options.tokenAmount
61+
? await cont.getEstimatedDevForTokens(
62+
options.path,
63+
options.tokenAmount,
64+
)
65+
: 'No tokenAmount provided',
66+
estimatedTokens: options.devAmount
67+
? await cont.getEstimatedTokensForDev(options.path, options.devAmount)
68+
: 'No devAmount provided',
69+
create: async () => {
70+
const tokenAmount = options.tokenAmount
71+
? options.tokenAmount
72+
: options.devAmount
73+
? await cont.getEstimatedTokensForDev(
74+
options.path,
75+
options.devAmount,
76+
)
77+
: 'Neither tokenAmount nor devAmount provided'
78+
const _overrides = {
79+
overrides: {
80+
...{ value: useERC20 ? undefined : tokenAmount },
81+
...options.overrides?.overrides,
82+
},
83+
}
84+
85+
const devAmountOut = options.devAmountOut
86+
? options.devAmountOut
87+
: options.tokenAmount
88+
? await cont.getEstimatedDevForTokens(
89+
options.path,
90+
options.tokenAmount,
91+
)
92+
: 'Neither devAmountOut nor tokenAmount provided'
93+
const deadline = options.deadline
94+
? options.deadline
95+
: ((await options.provider.provider?.getBlock('latest'))
96+
?.timestamp ?? Math.floor(new Date().getTime() / 1000)) + 300
97+
98+
return useERC20
99+
? whenDefined(options.from, async (from) => {
100+
return approveIfNeeded({
101+
provider: options.provider,
102+
requiredAmount: tokenAmount,
103+
from,
104+
token: options.token,
105+
to: await cont.contract().getAddress(),
106+
callback: async () => {
107+
return options.gatewayAddress &&
108+
typeof options.gatewayBasisPoints === 'number'
109+
? cont.swapTokensAndStakeDev(
110+
options.mintTo,
111+
options.path,
112+
options.destination,
113+
devAmountOut,
114+
deadline,
115+
tokenAmount,
116+
options.payload,
117+
options.token,
118+
options.gatewayAddress,
119+
options.gatewayBasisPoints.toString(),
120+
_overrides,
121+
)
122+
: cont.swapTokensAndStakeDev(
123+
options.mintTo,
124+
options.path,
125+
options.destination,
126+
devAmountOut,
127+
deadline,
128+
tokenAmount,
129+
options.payload,
130+
options.token,
131+
undefined,
132+
undefined,
133+
_overrides,
134+
)
135+
},
136+
})
137+
})
138+
: options.gatewayAddress &&
139+
typeof options.gatewayBasisPoints === 'number'
140+
? cont.swapTokensAndStakeDev(
141+
options.mintTo,
142+
options.path,
143+
options.destination,
144+
devAmountOut,
145+
deadline,
146+
tokenAmount,
147+
options.payload,
148+
undefined,
149+
options.gatewayAddress,
150+
options.gatewayBasisPoints.toString(),
151+
_overrides,
152+
)
153+
: cont.swapTokensAndStakeDev(
154+
options.mintTo,
155+
options.path,
156+
options.destination,
157+
devAmountOut,
158+
deadline,
159+
tokenAmount,
160+
options.payload,
161+
undefined,
162+
undefined,
163+
undefined,
164+
_overrides,
165+
)
166+
},
167+
}
168+
: undefined
169+
}

lib/agent/positionsCreateWithArbitraryTokens.ts

Lines changed: 0 additions & 164 deletions
This file was deleted.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@devprotocol/dev-kit",
33
"type": "module",
4-
"version": "8.0.2",
4+
"version": "8.1.0",
55
"description": "Dev Kit for JavaScript",
66
"author": "abyssparanoia",
77
"license": "Apache-2.0",

0 commit comments

Comments
 (0)