Skip to content
Merged
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
5 changes: 1 addition & 4 deletions examples/03-transfer-balance-threshold/src/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@ import { inputs } from './types'

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

const balance = tokenContract.balanceOf(inputs.recipient).unwrap()
const token = ERC20Token.fromAddress(inputs.token, inputs.chainId)
const threshold = BigInt.fromStringDecimal(inputs.threshold, token.decimals)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,10 @@ import { inputs } from './types'

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

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

Expand Down
16 changes: 4 additions & 12 deletions examples/05-invest-aave-idle-balance/src/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,17 @@ export default function main(): void {
const aToken = ERC20Token.fromAddress(inputs.aToken, inputs.chainId)
const aTokenContract = new AaveToken(aToken.address, aToken.chainId)

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

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

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

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

Expand Down
25 changes: 7 additions & 18 deletions examples/06-withdraw-from-aave-balance-threshold/src/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,41 +8,30 @@ export default function main(): void {
const aToken = ERC20Token.fromAddress(inputs.aToken, inputs.chainId)
const aTokenContract = new AaveToken(aToken.address, aToken.chainId)

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

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

const underlyingTokenBalanceInUsdResult = underlyingTokenBalance.toUsd()
if (underlyingTokenBalanceInUsdResult.isError) throw new Error(underlyingTokenBalanceInUsdResult.error)
const underlyingTokenBalanceInUsd = underlyingTokenBalanceInUsdResult.value
const underlyingTokenBalanceInUsd = underlyingTokenBalance.toUsd().unwrap()
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 aTokenDepositAmountResult = depositAmountUsd.toTokenAmount(aToken)
if (aTokenDepositAmountResult.isError) throw new Error(aTokenDepositAmountResult.error)
const aTokenDepositAmount = aTokenDepositAmountResult.value
const aTokenDepositAmount = depositAmountUsd.toTokenAmount(aToken).unwrap()

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

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

SwapBuilder.forChain(inputs.chainId)
Expand Down
24 changes: 6 additions & 18 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,25 +28,13 @@ export default function main(): void {

const context = environment.getContext()

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

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

const aUsdcSmartAccount = findTokenAmount(smartAccountTokens, aUSDC)
const usdcUser = findTokenAmount(userTokens, USDC)
Expand Down
12 changes: 3 additions & 9 deletions examples/08-relevant-tokens-query/src/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,9 @@ import { inputs } from './types'

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

for (let i = 0; i < tokens.length; i++) {
Expand Down
7 changes: 2 additions & 5 deletions examples/09-subgraph-query/src/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,7 @@ 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 me = environment.getContext().user
const amountInResult = new ERC20(inputs.tokenIn, inputs.chainId).balanceOf(me)
if (amountInResult.isError) throw new Error(amountInResult.error)
const amountIn = amountInResult.value
const amountIn = new ERC20(inputs.tokenIn, inputs.chainId).balanceOf(me).unwrap()
if (amountIn.isZero()) throw new Error('No amount in to swap')

const price = getTokenPrice(inputs.chainId, inputs.subgraphId, inputs.tokenIn, inputs.tokenOut)
Expand Down Expand Up @@ -55,8 +53,7 @@ function getTokenPrice(chainId: i32, subgraphId: string, tokenIn: Address, token

const query = `{pools(where: { token0: "${token0}", token1: "${token1}" }) {token0Price token1Price}}`
const queryResult = environment.subgraphQuery(chainId, subgraphId, query, null)
if (queryResult.isError) throw new Error(queryResult.error)
const data = JSON.parse<UniswapPoolsData>(queryResult.value.data)
const data = JSON.parse<UniswapPoolsData>(queryResult.unwrap().data)

if (tokenIn == token0 && tokenOut === token1) {
return BigInt.fromStringDecimal(data.pools[0].token1Price, PRICE_PRECISION)
Expand Down
18 changes: 6 additions & 12 deletions examples/10-rebalancing-tokens/src/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,7 @@ function shareByBps(amountUSD: USD, bps: i32): USD {
function getTokenAmount(chainId: u32, tokenAddress: Address): TokenAmount {
const me = environment.getContext().user
const contract = new ERC20(tokenAddress, chainId)
const balanceResult = contract.balanceOf(me)
if (balanceResult.isError) throw new Error(balanceResult.error)
const balance = balanceResult.value
const balance = contract.balanceOf(me).unwrap()
const token = ERC20Token.fromAddress(tokenAddress, chainId)
return TokenAmount.fromBigInt(token, balance)
}
Expand Down Expand Up @@ -51,9 +49,9 @@ export default function main(): void {
]

const currentBalancesUsd = [
tokenAmounts[0].toUsd().value,
tokenAmounts[1].toUsd().value,
tokenAmounts[2].toUsd().value,
tokenAmounts[0].toUsd().unwrap(),
tokenAmounts[1].toUsd().unwrap(),
tokenAmounts[2].toUsd().unwrap(),
]
const totalPortfolioUSD = currentBalancesUsd[0].plus(currentBalancesUsd[1]).plus(currentBalancesUsd[2])
if (totalPortfolioUSD.le(USD.zero())) {
Expand Down Expand Up @@ -90,12 +88,8 @@ export default function main(): void {
const surplusTokenIndex = surpluses[surplusIndex].index
const deficitTokenIndex = deficits[deficitIndex].index

const tokenInAmountResult = movedUSD.toTokenAmount(tokensMetadata[surplusTokenIndex])
if (tokenInAmountResult.isError) throw new Error(tokenInAmountResult.error)
const tokenInAmount = tokenInAmountResult.value
const expectedTokenOutAmounResult = movedUSD.toTokenAmount(tokensMetadata[deficitTokenIndex])
if (expectedTokenOutAmounResult.isError) throw new Error(expectedTokenOutAmounResult.error)
const expectedTokenOutAmount = expectedTokenOutAmounResult.value
const tokenInAmount = movedUSD.toTokenAmount(tokensMetadata[surplusTokenIndex]).unwrap()
const expectedTokenOutAmount = movedUSD.toTokenAmount(tokensMetadata[deficitTokenIndex]).unwrap()

const slippageFactor = BPS_DENOMINATOR.minus(BigInt.fromI32(inputs.slippageBps as i32))
const minAmountOut = expectedTokenOutAmount.amount.times(slippageFactor).div(BPS_DENOMINATOR)
Expand Down
5 changes: 1 addition & 4 deletions examples/12-dollar-cost-averaging/src/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,7 @@ export default function main(): void {

// Create amount from decimal string and estimate amount out
const amountIn = TokenAmount.fromStringDecimal(tokenIn, inputs.amount)
const expectedOutResult = amountIn.toTokenAmount(tokenOut)
if (expectedOutResult.isError) throw new Error(expectedOutResult.error)
const expectedOut = expectedOutResult.value

const expectedOut = amountIn.toTokenAmount(tokenOut).unwrap()
// Apply slippage to calculate the expected minimum amount out
const minAmountOut = expectedOut.applySlippageBps(inputs.slippageBps as i32)
log.info(`Calculated minOut: ${minAmountOut} (equivalent=${expectedOut}, slippageBps=${inputs.slippageBps})`)
Expand Down
2 changes: 1 addition & 1 deletion examples/13-bridge-and-invest-aave/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"compile:invest": "mimic compile -t src/invest.ts -m manifest.invest.yaml -o ./build/invest",
"deploy:bridge": "yarn codegen:bridge && yarn compile:bridge && mimic deploy --input ./build/bridge --output ./build/bridge --skip-compile",
"deploy:invest": "yarn codegen:invest && yarn compile:invest && mimic deploy --input ./build/invest --output ./build/invest --skip-compile",
"test": "yarn build && mimic test --skipCompile",
"test": "yarn build && mimic test --skip-compile",
"create-config:invest": "tsc -p tsconfig.create-config.json && tsx src/create-config.invest.ts",
"lint": "eslint ."
},
Expand Down
9 changes: 2 additions & 7 deletions examples/14-fee-collection/src/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,7 @@ export default function main(): void {
const context = environment.getContext()

// Find tokens with user's balance > 0
const amountsInResult = environment.relevantTokensQuery(context.user, [chainId], USD.zero(), [], ListType.DenyList)
if (amountsInResult.isError) throw new Error(amountsInResult.error)
const amountsIn = amountsInResult.value

const amountsIn = environment.relevantTokensQuery(context.user, [chainId], USD.zero(), [], ListType.DenyList).unwrap()
if (amountsIn.length == 0) {
log.info(`No tokens found on chain ${chainId}`)
return
Expand All @@ -35,9 +32,7 @@ export default function main(): void {

for (let i = 0; i < amountsIn.length; i++) {
const amountIn = amountsIn[i]
const amountOutResult = amountIn.toTokenAmount(USDC)
if (amountOutResult.isError) throw new Error(amountOutResult.error)
const amountOut = amountOutResult.value
const amountOut = amountIn.toTokenAmount(USDC).unwrap()
const minAmountOut = amountOut.times(slippageFactor).div(BPS_DENOMINATOR)

// Note that the recipient will receive the USDC
Expand Down
12 changes: 6 additions & 6 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -391,9 +391,9 @@
integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==

"@mimicprotocol/cli@latest":
version "0.0.1-rc.29"
resolved "https://registry.yarnpkg.com/@mimicprotocol/cli/-/cli-0.0.1-rc.29.tgz#98d204fd9c3a9481a5fe0f7bf160003a70ce6c8c"
integrity sha512-AZTXZky8Xt5NMr0Calirz/126+ctW2TjJKHimzaLYzHbHunZHChhBhTW2XkN2FAidAIr0vKjIuil3L9c5vUkTw==
version "0.0.1-rc.32"
resolved "https://registry.yarnpkg.com/@mimicprotocol/cli/-/cli-0.0.1-rc.32.tgz#d02174d9d79ff783844a88b145348190eaefec93"
integrity sha512-DM76e5311CMzjBuUUCaAZLrNLP08xcZeqftr+4vZgRWNajQ6Gbu3KehG8Kxa1tPpBUwLI7F247PFPFJtvqayFQ==
dependencies:
"@inquirer/prompts" "^7.2.4"
"@oclif/core" "^4.2.2"
Expand All @@ -408,9 +408,9 @@
zod "^3.24.1"

"@mimicprotocol/lib-ts@latest":
version "0.0.1-rc.29"
resolved "https://registry.yarnpkg.com/@mimicprotocol/lib-ts/-/lib-ts-0.0.1-rc.29.tgz#ba4e02763000d0c492bd7ff25b4a4a95a3f19038"
integrity sha512-KJaWwEfBRWOpR8b2w0ytlTJzLkg8eZ3iEKBNSvuMgIpNUK0eXAIlqa6Eo6Sq5VcdFu6O4JiNMmJbBrdTtRP1Rg==
version "0.0.1-rc.32"
resolved "https://registry.yarnpkg.com/@mimicprotocol/lib-ts/-/lib-ts-0.0.1-rc.32.tgz#735d9c71e02c63fdd1f5375ce2292bdff88f5561"
integrity sha512-0VhEvrDBFz+V12kuPSxjfDjF+rlCWcWb3QSphgzI8Gu6bGkf9jHtM24rcUFcGKg11r0lPp4Fw5qF4rs4iJ0gTg==
dependencies:
as-base58 "^0.1.1"
eslint-config-mimic "^0.0.3"
Expand Down