Mimic Protocol
  • GENERAL
    • What's Mimic Protocol
    • How it works
    • Roadmap
  • USE CASES AND EXAMPLES
    • Build a simple task
    • More examples
      • Account refilling
      • Block trade
      • Fee collection
      • Automated refunds
  • DEVELOPERS
    • Architecture
    • CLI
    • API
  • RESOURCES
    • Whitepaper
    • Glossary
    • Security
    • Press kit
    • Contact
Powered by GitBook
On this page
  • Collect
  • Swap
  • Bridge
  • Withdraw
  1. USE CASES AND EXAMPLES
  2. More examples

Fee collection

Collect

The goal of this task is to move tokens from an external source to the settler itself.

Task

import { Environment, log } from '@mimicprotocol/lib-ts'

import { ExternalSource, TaskInput } from './types'

export default function main(environment: Environment, input: TaskInput) {
  const tokens = environment.getRelevantERC20s(input.chainId, input.source)
	
  for (const token of tokens) {
    environment.call(
      settler: input.settler,
      chainId: input.chainId, 
      target: input.source, 
      data: ExternalSource.claim.encode(token.address, token.balance, input.settler),
      feeToken: input.feeToken,
      feeAmount: input.feeAmount,
    )
    log.info('Created call intent')
  }
}

Manifest

version: 1.0.0
name: Collect Task
description: Collects all tokens from an external source to the settler
trigger: cron
inputs:
  - chainId: number
  - source: address
  - settler: address
  - target: address
  - feeToken: address
  - feeAmount: number
abis:
  - './abis/ExternalSource.json'

Swap

The goal of this task is to swap all tokens above a certain value in dollars to a specific token on a network.

Task

import { Environment, log } from '@mimicprotocol/lib-ts'

import { TaskInput } from './types'

export default function main(environment: Environment, input: TaskInput) {
  const tokens = environment.getRelevantERC20s(
    input.chainId,
    input.settler,
    input.thresholdUsd,
    input.ignoredTokens
  )
	
  for (const token of tokens) {
    const minAmountOut = token.amountInUsd * (1 - input.slippage * 100)
    environment.swap(
      settler: settler, 
      sourceChain: input.chainId,
      tokenIn: token.address,
      tokenOut: input.usdc,
      amountIn: token.balance,
      minAmountOut: minAmountOut,
    )
    log.info('Created swap intent')
  }
}

Manifest

version: 1.0.0
name: Swap Task
description: Swap all tokens above certain threshold in dollars to a token
trigger: cron
inputs:
  - chainId: number
  - settler: address
  - thresholdUsd: number
  - slippage: number 
  - usdc: address
  - ignoredTokens: address[]

Bridge

The goal of this task is to bridge all tokens from all chains to a main one at the end of the month.

Task

import { Environment, log } from '@mimicprotocol/lib-ts'

import { TaskInput } from './types'

export default function main(environment: Environment, input: TaskInput) {
  const sourceUsdc = ERC20.load(input.sourceChain, input.sourceUsdc)
  const balance = sourceUsdc.balanceOf(environment.signer)
  if (balance >= input.thresholdUsd) {
    environment.swap(
      settler: settler,
      sourceChain: input.sourceChain,
      tokenIn: input.sourceUsdc,
      amountIn: balance,
      destinationChain: input.destinationChain,
      tokenOut: input.destinationUsdc,
      minAmountOut: balance - input.feeAmount
    )
  }
  log.info('Created bridge intent')
}

Manifest

version: 1.0.0
name: Bridge Task
description: Bridges all tokens above certain threshold in dollars to a token
trigger: balance
inputs:
  - settler: address
  - thresholdUsd: number
  - feeAmount: number 
  - sourceChain: number
  - sourceUsdc: address
  - destinationChain: number
  - destinationUsdc: address
abis:
  - './abis/ERC20.json'

Withdraw

The goal of this task is to withdraw the whole amount of USDC to a recipient address paying the service fees.

Implementation

import { Environment, log } from '@mimicprotocol/lib-ts'

import { TaskInput } from './types'

export default function main(environment: Environment, input: TaskInput) {
  const usdc = ERC20.load(input.chainId, input.usdc)
  const balance = usdc.balanceOf(environment.signer)
  const balanceAfterSolverFee = balance - input.solverFeeAmount
  const feeAmount = balanceAfterSolverFee.mul(input.serviceFeePct)
  const balanceAfterFees = balanceAfterSolverFee - feeAmount

  environment.transfer(
    settler: settler,
    chainId: input.chainId,
    token: input.usdc,
    amount: balanceAfterFees,
    to: input.recipient,
    feeAmount: input.solverFeeAmount / 2,
  )
	
  environment.transfer(
    settler: settler,
    chainId: input.chainId,
    token: input.usdc,
    amount: feeAmount,
    to: input.feeCollector,
    feeAmount: input.solverFeeAmount / 2,
  )

  log.info('Created withdraw intent')
}

Manifest

version: 1.0.0
name: Withdraw Task
description: Withdraws all USDC charging a service fee
trigger: cron
inputs:
  - settler: address
  - chainId: number
  - usdc: address
  - recipient: address
  - solverFeeAmount: number 
  - serviceFeePct: number
  - feeCollector: address
abis:
  - './abis/ERC20.json'
PreviousBlock tradeNextAutomated refunds

Last updated 2 months ago