Skip to content
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 examples/01-simple-transfer/.mocharc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"node-option": ["import=tsx/esm"]
}
3 changes: 3 additions & 0 deletions examples/02-simple-transfer-with-inputs/.mocharc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"node-option": ["import=tsx/esm"]
}
4 changes: 2 additions & 2 deletions examples/02-simple-transfer-with-inputs/tests/task.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { fp, OpType, randomEvmAddress } from '@mimicprotocol/sdk'
import { Context, ContractCallMock, runTask, Transfer } from '@mimicprotocol/test-ts'
import { Context, EvmCallQueryMock, runTask, Transfer } from '@mimicprotocol/test-ts'
import { expect } from 'chai'
import { Interface } from 'ethers'

Expand All @@ -24,7 +24,7 @@ describe('Task', () => {
maxFee: '0.1', // 0.1 tokens
}

const calls: ContractCallMock[] = [
const calls: EvmCallQueryMock[] = [
{
request: {
to: inputs.token,
Expand Down
3 changes: 3 additions & 0 deletions examples/03-transfer-balance-threshold/.mocharc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"node-option": ["import=tsx/esm"]
}
4 changes: 3 additions & 1 deletion examples/03-transfer-balance-threshold/src/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import { inputs } from './types'

export default function main(): void {
const tokenContract = new ERC20(inputs.token, inputs.chainId)
const balance = tokenContract.balanceOf(inputs.recipient)
const balanceResponse = tokenContract.balanceOf(inputs.recipient)
if (balanceResponse.isError) throw new Error(balanceResponse.error)
const balance = balanceResponse.value

const token = ERC20Token.fromAddress(inputs.token, inputs.chainId)
const threshold = BigInt.fromStringDecimal(inputs.threshold, token.decimals)
Expand Down
4 changes: 2 additions & 2 deletions examples/03-transfer-balance-threshold/tests/task.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { fp, OpType, randomEvmAddress } from '@mimicprotocol/sdk'
import { Context, ContractCallMock, runTask, Transfer } from '@mimicprotocol/test-ts'
import { Context, EvmCallQueryMock, runTask, Transfer } from '@mimicprotocol/test-ts'
import { expect } from 'chai'
import { Interface } from 'ethers'

Expand All @@ -25,7 +25,7 @@ describe('Task', () => {
threshold: '10.2', // 10.2 tokens
}

const buildCalls = (balance: string): ContractCallMock[] => [
const buildCalls = (balance: string): EvmCallQueryMock[] => [
{
request: {
to: inputs.token,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"node-option": ["import=tsx/esm"]
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,14 @@ import { inputs } from './types'

export default function main(): void {
const tokenContract = new ERC20(inputs.token, inputs.chainId)
const balance = tokenContract.balanceOf(inputs.recipient)
const balanceResponse = tokenContract.balanceOf(inputs.recipient)
if (balanceResponse.isError) throw new Error(balanceResponse.error)
const balance = balanceResponse.value

const token = ERC20Token.fromAddress(inputs.token, inputs.chainId)
const balanceInUsd = TokenAmount.fromBigInt(token, balance).toUsd()
const balanceInUsdResult = TokenAmount.fromBigInt(token, balance).toUsd()
if (balanceInUsdResult.isError) throw new Error(balanceInUsdResult.error)
const balanceInUsd = balanceInUsdResult.value
const thresholdUsd = USD.fromStringDecimal(inputs.thresholdUsd)
log.info(`Balance in USD: ${balanceInUsd}`)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { fp, OpType, randomEvmAddress } from '@mimicprotocol/sdk'
import { Context, ContractCallMock, GetPriceMock, runTask, Transfer } from '@mimicprotocol/test-ts'
import { Context, EvmCallQueryMock, runTask, TokenPriceQueryMock, Transfer } from '@mimicprotocol/test-ts'
import { expect } from 'chai'
import { Interface } from 'ethers'

Expand All @@ -25,14 +25,14 @@ describe('Task', () => {
thresholdUsd: '10.5', // 10.5 USD
}

const prices: GetPriceMock[] = [
const prices: TokenPriceQueryMock[] = [
{
request: { token: inputs.token, chainId: inputs.chainId },
response: ['1000000000000000000'], // 1 token = 1 USD
},
]

const buildCalls = (balance: string): ContractCallMock[] => [
const buildCalls = (balance: string): EvmCallQueryMock[] => [
{
request: {
to: inputs.token,
Expand Down
3 changes: 3 additions & 0 deletions examples/05-invest-aave-idle-balance/.mocharc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"node-option": ["import=tsx/esm"]
}
18 changes: 14 additions & 4 deletions examples/05-invest-aave-idle-balance/src/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,25 @@ export default function main(): void {
const aToken = ERC20Token.fromAddress(inputs.aToken, inputs.chainId)
const aTokenContract = new AaveToken(aToken.address, aToken.chainId)

const underlyingTokenAddress = aTokenContract.UNDERLYING_ASSET_ADDRESS()
const underlyingTokenAddressResponse = aTokenContract.UNDERLYING_ASSET_ADDRESS()
if (underlyingTokenAddressResponse.isError) throw new Error(underlyingTokenAddressResponse.error)
const underlyingTokenAddress = underlyingTokenAddressResponse.value
const underlyingToken = ERC20Token.fromAddress(underlyingTokenAddress, aToken.chainId)

const aavePool = new AavePool(aTokenContract.POOL(), inputs.chainId)
const aavePoolAddressResponse = aTokenContract.POOL()
if (aavePoolAddressResponse.isError) throw new Error(aavePoolAddressResponse.error)
const aavePoolAddress = aavePoolAddressResponse.value
const aavePool = new AavePool(aavePoolAddress, inputs.chainId)

const underlyingTokenContract = new ERC20(underlyingToken.address, underlyingToken.chainId)
const underlyingTokenBalanceAmount = underlyingTokenContract.balanceOf(inputs.smartAccount)
const underlyingTokenBalanceAmountResponse = underlyingTokenContract.balanceOf(inputs.smartAccount)
if (underlyingTokenBalanceAmountResponse.isError) throw new Error(underlyingTokenBalanceAmountResponse.error)
const underlyingTokenBalanceAmount = underlyingTokenBalanceAmountResponse.value

const underlyingTokenBalance = TokenAmount.fromBigInt(underlyingToken, underlyingTokenBalanceAmount)
const underlyingTokenBalanceInUsd = underlyingTokenBalance.toUsd()
const underlyingTokenBalanceInUsdResult = underlyingTokenBalance.toUsd()
if (underlyingTokenBalanceInUsdResult.isError) throw new Error(underlyingTokenBalanceInUsdResult.error)
const underlyingTokenBalanceInUsd = underlyingTokenBalanceInUsdResult.value
const thresholdUsd = USD.fromStringDecimal(inputs.thresholdUsd)
log.info(`Underlying balance in USD: ${underlyingTokenBalanceInUsd}`)

Expand Down
6 changes: 3 additions & 3 deletions examples/05-invest-aave-idle-balance/tests/task.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EvmCallIntent, OpType, randomEvmAddress } from '@mimicprotocol/sdk'
import { Context, ContractCallMock, GetPriceMock, runTask } from '@mimicprotocol/test-ts'
import { Context, EvmCallQueryMock, runTask, TokenPriceQueryMock } from '@mimicprotocol/test-ts'
import { expect } from 'chai'
import { Interface } from 'ethers'

Expand Down Expand Up @@ -31,7 +31,7 @@ describe('Task', () => {
const underlyingToken = randomEvmAddress() // USDC
const aavePool = randomEvmAddress()

const prices: GetPriceMock[] = [
const prices: TokenPriceQueryMock[] = [
{
request: { token: inputs.aToken, chainId: inputs.chainId },
response: ['1000000000000000000'], // 1 aOptUSDC = 1 USD
Expand All @@ -42,7 +42,7 @@ describe('Task', () => {
},
]

const buildCalls = (balance: string): ContractCallMock[] => [
const buildCalls = (balance: string): EvmCallQueryMock[] => [
// aOptUSDC
{
request: {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"node-option": ["import=tsx/esm"]
}
30 changes: 19 additions & 11 deletions examples/06-withdraw-from-aave-balance-threshold/src/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,45 @@ import { AaveToken } from './types/AaveToken'
import { ERC20 } from './types/ERC20'
import { inputs } from './types'

const BPS_DENOMINATOR = BigInt.fromI32(10_000)

export default function main(): void {
if (BigInt.fromI32(inputs.slippageBps as i32) > BPS_DENOMINATOR) throw new Error('Slippage must be between 0 and 100')

const aToken = ERC20Token.fromAddress(inputs.aToken, inputs.chainId)
const aTokenContract = new AaveToken(aToken.address, aToken.chainId)

const underlyingTokenAddress = aTokenContract.UNDERLYING_ASSET_ADDRESS()
const underlyingTokenAddressResponse = aTokenContract.UNDERLYING_ASSET_ADDRESS()
if (underlyingTokenAddressResponse.isError) throw new Error(underlyingTokenAddressResponse.error)
const underlyingTokenAddress = underlyingTokenAddressResponse.value
const underlyingToken = ERC20Token.fromAddress(underlyingTokenAddress, aToken.chainId)

const underlyingTokenContract = new ERC20(underlyingToken.address, underlyingToken.chainId)
const underlyingTokenBalanceAmount = underlyingTokenContract.balanceOf(inputs.recipient)
const underlyingTokenBalanceAmountResponse = underlyingTokenContract.balanceOf(inputs.recipient)
if (underlyingTokenBalanceAmountResponse.isError) throw new Error(underlyingTokenBalanceAmountResponse.error)
const underlyingTokenBalanceAmount = underlyingTokenBalanceAmountResponse.value
const underlyingTokenBalance = TokenAmount.fromBigInt(underlyingToken, underlyingTokenBalanceAmount)
const underlyingTokenBalanceInUsd = underlyingTokenBalance.toUsd()

const underlyingTokenBalanceInUsdResult = underlyingTokenBalance.toUsd()
if (underlyingTokenBalanceInUsdResult.isError) throw new Error(underlyingTokenBalanceInUsdResult.error)
const underlyingTokenBalanceInUsd = underlyingTokenBalanceInUsdResult.value
const thresholdUsd = USD.fromStringDecimal(inputs.thresholdUsd)
log.info(`Recipient underlying balance in USD: ${underlyingTokenBalanceInUsd}`)

if (underlyingTokenBalanceInUsd.gt(thresholdUsd)) log.info('Recipient threshold not met')
else {
const depositAmountUsd = thresholdUsd.times(BigInt.fromI32(2)).minus(underlyingTokenBalanceInUsd)
const aTokenDepositAmount = depositAmountUsd.toTokenAmount(aToken)
const aTokenDepositAmountResult = depositAmountUsd.toTokenAmount(aToken)
if (aTokenDepositAmountResult.isError) throw new Error(aTokenDepositAmountResult.error)
const aTokenDepositAmount = aTokenDepositAmountResult.value

const me = environment.getContext().user
const aTokenBalanceAmount = aTokenContract.balanceOf(me)
const aTokenBalanceAmountResponse = aTokenContract.balanceOf(me)
if (aTokenBalanceAmountResponse.isError) throw new Error(aTokenBalanceAmountResponse.error)
const aTokenBalanceAmount = aTokenBalanceAmountResponse.value
const aTokenBalance = TokenAmount.fromBigInt(aToken, aTokenBalanceAmount)

if (aTokenBalance.lt(aTokenDepositAmount)) log.info('Sender balance not enough')
else {
const slippageFactor = BPS_DENOMINATOR.minus(BigInt.fromI32(inputs.slippageBps as i32))
const minAmountOut = aTokenDepositAmount.toTokenAmount(underlyingToken).times(slippageFactor).div(BPS_DENOMINATOR)
const expectedOutResult = aTokenDepositAmount.toTokenAmount(underlyingToken)
if (expectedOutResult.isError) throw new Error(expectedOutResult.error)
const minAmountOut = expectedOutResult.value.applySlippageBps(inputs.slippageBps as i32)
log.info(`Min amount out: ${minAmountOut}`)

SwapBuilder.forChain(inputs.chainId)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { OpType, randomEvmAddress } from '@mimicprotocol/sdk'
import { Context, ContractCallMock, GetPriceMock, runTask, Swap } from '@mimicprotocol/test-ts'
import { Context, EvmCallQueryMock, runTask, Swap, TokenPriceQueryMock } from '@mimicprotocol/test-ts'
import { expect } from 'chai'
import { Interface } from 'ethers'

Expand Down Expand Up @@ -28,7 +28,7 @@ describe('Task', () => {

const underlyingToken = randomEvmAddress() // USDC

const prices: GetPriceMock[] = [
const prices: TokenPriceQueryMock[] = [
{
request: { token: inputs.aToken, chainId: inputs.chainId },
response: ['1000000000000000000'], // 1 aOptUSDC = 1 USD
Expand All @@ -39,7 +39,7 @@ describe('Task', () => {
},
]

const buildCalls = (recipientBalance: string, userBalance: string): ContractCallMock[] => [
const buildCalls = (recipientBalance: string, userBalance: string): EvmCallQueryMock[] => [
// aOptUSDC
{
request: {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"node-option": ["import=tsx/esm"]
}
9 changes: 7 additions & 2 deletions examples/07-withdraw-from-aave-swap-and-transfer/src/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,26 @@ export default function main(): void {

const context = environment.getContext()

const userTokens = environment.getRelevantTokens(
const userTokensResponse = environment.relevantTokensQuery(
context.user,
[chainId],
USD.zero(),
[USDC, aUSDC],
ListType.AllowList
)
if (userTokensResponse.isError) throw new Error(userTokensResponse.error)
const userTokens = userTokensResponse.value

const smartAccountTokens = environment.getRelevantTokens(
const smartAccountTokensResponse = environment.relevantTokensQuery(
inputs.smartAccount,
[chainId],
USD.zero(),
[aUSDC],
ListType.AllowList
)
if (smartAccountTokensResponse.isError) throw new Error(smartAccountTokensResponse.error)
const smartAccountTokens = smartAccountTokensResponse.value

const aUsdcSmartAccount = findTokenAmount(smartAccountTokens, aUSDC)
const usdcUser = findTokenAmount(userTokens, USDC)
const aUsdcUser = findTokenAmount(userTokens, aUSDC)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import { Chains, OpType, randomEvmAddress } from '@mimicprotocol/sdk'
import {
Call,
Context,
ContractCallMock,
GetPriceMock,
GetRelevantTokensMock,
EvmCallQueryMock,
RelevantTokensQueryMock,
runTask,
Swap,
TokenPriceQueryMock,
Transfer,
} from '@mimicprotocol/test-ts'
import { expect } from 'chai'
Expand Down Expand Up @@ -41,14 +41,14 @@ describe('Task', () => {
maxFeeUsdt: '1', // 1 USDT
}

const calls: ContractCallMock[] = [
const calls: EvmCallQueryMock[] = [
{
request: { to: tokens.USDT, chainId, fnSelector: ERC20Interface.getFunction('decimals')!.selector },
response: { value: '6', abiType: 'uint8' },
},
]

const prices: GetPriceMock[] = [
const prices: TokenPriceQueryMock[] = [
{
request: { token: tokens.aUSDC, chainId },
response: ['1000000'],
Expand All @@ -71,7 +71,7 @@ describe('Task', () => {
aUsdcSmartAccountBalance: string
usdcUserBalance: string
aUsdcUserBalance: string
}): GetRelevantTokensMock[] => [
}): RelevantTokensQueryMock[] => [
{
request: {
owner: inputs.smartAccount,
Expand Down
3 changes: 3 additions & 0 deletions examples/08-relevant-tokens-query/.mocharc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"node-option": ["import=tsx/esm"]
}
12 changes: 10 additions & 2 deletions examples/08-relevant-tokens-query/src/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,15 @@ import { inputs } from './types'

export default function main(): void {
const context = environment.getContext()
const tokens = environment.getRelevantTokens(context.user, [inputs.chainId], USD.zero(), [], ListType.DenyList)
const tokensResponse = environment.relevantTokensQuery(
context.user,
[inputs.chainId],
USD.zero(),
[],
ListType.DenyList
)
if (tokensResponse.isError) throw new Error(tokensResponse.error)
const tokens = tokensResponse.value
const builder = TransferBuilder.forChain(inputs.chainId)

for (let i = 0; i < tokens.length; i++) {
Expand All @@ -13,7 +21,7 @@ export default function main(): void {
log.info(`Adding transfer for ${token} on chain ${inputs.chainId}`)
}

if (builder.transfers.length == 0) {
if (builder.getTransfers().length === 0) {
log.info(`No tokens found on chain ${inputs.chainId}`)
return
}
Expand Down
8 changes: 4 additions & 4 deletions examples/08-relevant-tokens-query/tests/task.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { NATIVE_TOKEN_ADDRESS, OpType, randomEvmAddress } from '@mimicprotocol/sdk'
import { ContractCallMock, GetRelevantTokensMock, runTask, Transfer } from '@mimicprotocol/test-ts'
import { EvmCallQueryMock, RelevantTokensQueryMock, runTask, Transfer } from '@mimicprotocol/test-ts'
import { expect } from 'chai'
import { Interface } from 'ethers'

Expand All @@ -25,7 +25,7 @@ describe('Task', () => {
recipient: randomEvmAddress(),
}

const calls: ContractCallMock[] = [
const calls: EvmCallQueryMock[] = [
{
request: { chainId, to: USDC, fnSelector: ERC20Interface.getFunction('decimals')!.selector },
response: { value: '6', abiType: 'uint8' },
Expand All @@ -37,7 +37,7 @@ describe('Task', () => {
]

describe('when the user has some balance for the requested tokens', () => {
const relevantTokens: GetRelevantTokensMock[] = [
const relevantTokens: RelevantTokensQueryMock[] = [
{
request: {
owner: context.user,
Expand Down Expand Up @@ -87,7 +87,7 @@ describe('Task', () => {
})

describe('when the user does not have balance for the requested tokens', () => {
const relevantTokens: GetRelevantTokensMock[] = [
const relevantTokens: RelevantTokensQueryMock[] = [
{
request: {
owner: context.user,
Expand Down
3 changes: 3 additions & 0 deletions examples/09-subgraph-query/.mocharc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"node-option": ["import=tsx/esm"]
}
Loading