import { WalletProvider } from '../wallet-providers'; import BN from 'bn.js'; import { TransactionReceipt } from 'web3-core'; import { DepotSafe, MerchantSafe, PrepaidCardSafe, Safe, TransactionOptions, ViewSafesResult, BridgeValidationResult, } from '@cardstack/cardpay-sdk'; import { ConvertibleSymbol, ConversionFunction, BridgeableSymbol, BridgedTokenSymbol, } from '@cardstack/web-client/utils/token'; import { Emitter } from '../events'; import { TaskGenerator } from 'ember-concurrency'; import { UsdConvertibleSymbol } from '@cardstack/web-client/services/token-to-usd'; export type Layer1ChainEvent = | 'disconnect' | 'incorrect-chain' | 'correct-chain' | 'account-changed' | 'websocket-disconnected'; export type Layer2ChainEvent = | 'disconnect' | 'incorrect-chain' | 'correct-chain' | 'account-changed' | 'websocket-disconnected'; export interface Web3Strategy { isConnected: boolean; disconnect(): Promise; bridgeExplorerUrl(txnHash: TransactionHash): string; } export interface ApproveOptions { onTxnHash?(txnHash: TransactionHash): void; } export interface RelayTokensOptions { onTxnHash?(txnHash: TransactionHash): void; } export interface ClaimBridgedTokensOptions { onTxnHash?(txnHash: TransactionHash): void; } export interface WithdrawalLimits { min: BN; max: BN; } export interface Layer1Web3Strategy extends Web3Strategy, Emitter { isInitializing: boolean; isConnected: boolean; currentProviderId: string | undefined; defaultTokenBalance: BN | undefined; daiBalance: BN | undefined; cardBalance: BN | undefined; nativeTokenSymbol: string | undefined; bridgeConfirmationBlockCount: number; refreshBalances(): Promise; connect(walletProvider: WalletProvider): Promise; waitForAccount: Promise; approve( amountInWei: BN, token: string, options?: ApproveOptions ): Promise; resumeApprove(txnHash: string): Promise; relayTokens( token: ChainAddress, destinationAddress: ChainAddress, amountInWei: BN, options?: RelayTokensOptions ): Promise; resumeRelayTokens(txnHash: string): Promise; blockExplorerUrl(txnHash: TransactionHash): string; claimBridgedTokens( bridgeValidationResult: BridgeValidationResult, options?: ClaimBridgedTokensOptions ): Promise; resumeClaimBridgedTokens(txnHash: string): Promise; getBlockConfirmation(blockNumber: TxnBlockNumber): Promise; getEstimatedGasForWithdrawalClaim(symbol: BridgeableSymbol): Promise; updateUsdConverters( symbolsToUpdate: UsdConvertibleSymbol[] ): Promise>; } export interface Layer2Web3Strategy extends Web3Strategy, Emitter { isInitializing: boolean; isConnected: boolean; defaultTokenBalance: BN | undefined; cardBalance: BN | undefined; depotSafe: DepotSafe | null; issuePrepaidCardSpendMinValue: number; /** * This property should only be accessed after layer 2 has been connected */ issuePrepaidCardDaiMinValue: BN; walletConnectUri: string | undefined; initializeTask(): TaskGenerator; updateUsdConverters( symbolsToUpdate: UsdConvertibleSymbol[] ): Promise>; blockExplorerUrl(txnHash: TransactionHash): string; getBlockConfirmation(blockNumber: number): Promise; getBlockHeight(): Promise; awaitBridgedToLayer2( fromBlock: BN, receiver: ChainAddress ): Promise; getWithdrawalLimits( tokenSymbol: BridgedTokenSymbol ): Promise; bridgeToLayer1( safeAddress: string, receiverAddress: string, tokenSymbol: BridgedTokenSymbol, amountInWei: string, options: TransactionOptions ): Promise; resumeBridgeToLayer1(txnHash: string): Promise; awaitBridgedToLayer1( fromBlock: BN, txnHash: TransactionHash ): Promise; getLatestSafe(address: string): Promise; viewSafesTask(account: string): TaskGenerator; checkHubAuthenticationValid(authToken: string): Promise; authenticate(): Promise; issuePrepaidCard( safeAddress: string, amount: number, customizationDid: string, options?: TransactionOptions ): Promise; resumeIssuePrepaidCardTransaction(txnHash: string): Promise; fetchMerchantRegistrationFee(): Promise; registerMerchant( prepaidCardAddress: string, infoDid: string, options: TransactionOptions ): Promise; resumeRegisterMerchantTransaction(txnHash: string): Promise; defaultTokenSymbol: BridgedTokenSymbol; refreshSafesAndBalances(): void; convertFromSpend(symbol: ConvertibleSymbol, amount: number): Promise; } export type TransactionHash = string; export type TxnBlockNumber = number; export type ChainAddress = string; export type Layer1NetworkSymbol = 'kovan' | 'mainnet'; export type TestLayer1NetworkSymbol = 'test-layer1'; export type Layer2NetworkSymbol = 'xdai' | 'sokol'; export type TestLayer2NetworkSymbol = 'test-layer2'; export type NetworkSymbol = Layer1NetworkSymbol | Layer2NetworkSymbol;