Skip to content

Commit

Permalink
🧹 Stargate state snapshot: Collection LP Token information [4/N] (#21)
Browse files Browse the repository at this point in the history
  • Loading branch information
janjakubnanista authored Jun 12, 2024
1 parent 8bfc4b9 commit 66277fa
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 3 deletions.
4 changes: 4 additions & 0 deletions packages/stg-evm-v2/devtools/src/erc20/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ import { OwnableNodeConfigSchema } from '@layerzerolabs/ua-devtools'

import { Allowance, AllowanceConfig, ERC20NodeConfig, MintConfig } from './types'

export const NameSchema = z.string()

export const SymbolSchema = z.string()

export const AllowancesSchema = z.record(AddressSchema, BigNumberishBigIntSchema) satisfies z.ZodSchema<
Allowance,
z.ZodTypeDef,
Expand Down
26 changes: 26 additions & 0 deletions packages/stg-evm-v2/devtools/src/erc20/sdk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import {
} from '@layerzerolabs/devtools'
import { Ownable } from '@layerzerolabs/ua-devtools-evm'

import { NameSchema, SymbolSchema } from './schema'

import type { IERC20 } from './types'

export class ERC20 extends Ownable implements IERC20 {
Expand All @@ -31,6 +33,30 @@ export class ERC20 extends Ownable implements IERC20 {
return UIntNumberSchema.parse(decimals)
}

@AsyncRetriable()
async getName(): Promise<string> {
this.logger.verbose(`Getting token name`)

const name = await tapError(
() => this.contract.contract.name(),
(error) => (this.logger.error(`Failed to get token name: ${error}`), undefined)
)

return NameSchema.parse(name)
}

@AsyncRetriable()
async getSymbol(): Promise<string> {
this.logger.verbose(`Getting token symbol`)

const symbol = await tapError(
() => this.contract.contract.symbol(),
(error) => (this.logger.error(`Failed to get token symbol: ${error}`), undefined)
)

return SymbolSchema.parse(symbol)
}

@AsyncRetriable()
async getAllowance(owner: OmniAddress, spender: OmniAddress): Promise<bigint> {
const allowance = await this.contract.contract.allowance(owner, spender)
Expand Down
3 changes: 3 additions & 0 deletions packages/stg-evm-v2/devtools/src/erc20/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ export type ERC20Factory<TERC20 extends IERC20 = IERC20, TOmniPoint = OmniPoint>

export interface IERC20 extends IOmniSDK, IOwnable {
approve(spender: OmniAddress, amount: bigint): Promise<OmniTransaction>
// TODO Rename to getDecimals() to follow the getter convention
decimals(): Promise<number>
getName(): Promise<string>
getSymbol(): Promise<string>
getAllowance(owner: OmniAddress, spender: OmniAddress): Promise<bigint>
mint(spender: OmniAddress, amount: bigint): Promise<OmniTransaction>
}
Expand Down
48 changes: 45 additions & 3 deletions packages/stg-evm-v2/tasks/snapshot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { ENDPOINT_IDS } from '@layerzerolabs/test-devtools'

import { AddressConfig, createAssetFactory } from '../devtools/src/asset'
import { createCreditMessagingFactory } from '../devtools/src/credit-messaging'
import { createERC20Factory } from '../devtools/src/erc20'

import type { ActionType } from 'hardhat/types'

Expand Down Expand Up @@ -154,11 +155,12 @@ const createCollectCreditMessaging =
return snapshot
}

export const createCollectAsset =
const createCollectAsset =
(
getEnvironment = createGetHreByEid(),
contractFactory = createConnectedContractFactory(createContractFactory(getEnvironment)),
createSdk = createAssetFactory(contractFactory)
createSdk = createAssetFactory(contractFactory),
collectERC20 = createCollectERC20(getEnvironment, contractFactory)
) =>
async (point: OmniPoint): Promise<AssetSnapshot> => {
const logger = createModuleLogger(`Asset @ ${formatOmniPoint(point)}`)
Expand All @@ -170,10 +172,11 @@ export const createCollectAsset =
const sdk = await createSdk(point)

logger.verbose(`Collecting basic information`)
const [owner, paused, addressConfig] = await Promise.all([
const [owner, paused, addressConfig, lpTokenAddress] = await Promise.all([
sdk.getOwner(),
sdk.isPaused(),
sdk.getAddressConfig(),
sdk.getLPToken(),
])

// Now we'll check the OFT paths
Expand All @@ -192,12 +195,17 @@ export const createCollectAsset =
)
)

// If the asset has an LP token attached, we'll collect its information
const lpToken =
lpTokenAddress == null ? undefined : await collectERC20({ address: lpTokenAddress, eid: point.eid })

// For now we'll collect nothing at all
const snapshot: AssetSnapshot = {
address: point.address,
addressConfig,
owner,
paused,
lpToken,
oftPaths: oftPaths.flat(),
}

Expand All @@ -207,6 +215,32 @@ export const createCollectAsset =
return snapshot
}

const createCollectERC20 =
(
getEnvironment = createGetHreByEid(),
contractFactory = createConnectedContractFactory(createContractFactory(getEnvironment)),
createSdk = createERC20Factory(contractFactory)
) =>
async (point: OmniPoint): Promise<ERC20TokenSnapshot> => {
const logger = createModuleLogger(`Asset @ ${formatOmniPoint(point)}`)

logger.info(`Starting`)

// We'll collect the information through an SDK (to use retry, schemas and all that)
logger.verbose(`Creating an SDK`)
const sdk = await createSdk({ ...point, contractName: 'ERC20' })

logger.verbose(`Collecting basic information`)
const [name, symbol, decimals] = await Promise.all([sdk.getName(), sdk.getSymbol(), sdk.decimals()])

const snapshot: ERC20TokenSnapshot = { address: point.address, name, symbol, decimals }

logger.info(`Done`)
logger.debug(`Collected:\n${printJson(snapshot)}`)

return snapshot
}

/**
* Helper utility to get all possible peer endpoint IDs for a particular endpoint ID
*
Expand Down Expand Up @@ -278,9 +312,17 @@ interface AssetSnapshot {
paused: boolean
address: OmniAddress
addressConfig: AddressConfig
lpToken?: ERC20TokenSnapshot
oftPaths: OFTPath[]
}

interface ERC20TokenSnapshot {
address: OmniAddress
name: string
symbol: string
decimals: number
}

/**
* Represents an OFT path for an Asset
*/
Expand Down

0 comments on commit 66277fa

Please sign in to comment.