Skip to content

Commit

Permalink
Merge remote-tracking branch 'other/main' into testing-new-flags
Browse files Browse the repository at this point in the history
  • Loading branch information
jagodarybacka committed Oct 18, 2023
2 parents 7c55e6d + 3a58e27 commit ad45117
Show file tree
Hide file tree
Showing 25 changed files with 2,374 additions and 338 deletions.
5 changes: 5 additions & 0 deletions .env.defaults
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,9 @@ SUPPORT_ARBITRUM_NOVA=false
SUPPORT_SWAP_QUOTE_REFRESH=false
SUPPORT_ACHIEVEMENTS_BANNER=false
SUPPORT_NFT_SEND=false
SUPPORT_THE_ISLAND=true
SUPPORT_THE_ISLAND_ON_TENDERLY=false
USE_MAINNET_FORK=false
ARBITRUM_FORK_RPC=https://rpc.tenderly.co/fork/2fc2cf12-5c58-439f-9b5e-967bfd02191a
TESTNET_TAHO_DEPLOYER_ADDRESS=0x55B180c3470dA8E31761d45468e4E61DbE13Eb9B
TESTNET_TAHO_ADDRESS=0x78f04eC76df38Fcb37971Efa8EcbcB33f52dae0F
3 changes: 3 additions & 0 deletions background/features.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ export const RuntimeFlag = {
SUPPORT_SWAP_QUOTE_REFRESH: process.env.SUPPORT_SWAP_QUOTE_REFRESH === "true",
SUPPORT_CUSTOM_NETWORKS: process.env.SUPPORT_CUSTOM_NETWORKS === "true",
SUPPORT_CUSTOM_RPCS: process.env.SUPPORT_CUSTOM_RPCS === "true",
SUPPORT_THE_ISLAND: process.env.SUPPORT_THE_ISLAND === "true",
SUPPORT_THE_ISLAND_ON_TENDERLY:
process.env.SUPPORT_THE_ISLAND_ON_TENDERLY === "true",
} as const

type BuildTimeFlagType = keyof typeof BuildTimeFlag
Expand Down
35 changes: 21 additions & 14 deletions background/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import {
ProviderBridgeService,
TelemetryService,
ServiceCreatorFunction,
DoggoService,
IslandService,
LedgerService,
SigningService,
NFTsService,
Expand All @@ -41,7 +41,7 @@ import {
import { HexString, NormalizedEVMAddress } from "./types"
import { SignedTransaction } from "./networks"
import { AccountBalance, AddressOnNetwork, NameOnNetwork } from "./accounts"
import { Eligible } from "./services/doggo/types"
import { Eligible, ReferrerStats } from "./services/island/types"

import rootReducer from "./redux-slices"
import {
Expand All @@ -58,6 +58,7 @@ import {
removeAssetData,
} from "./redux-slices/assets"
import {
addIslandAsset,
setEligibility,
setEligibilityLoading,
setReferrer,
Expand Down Expand Up @@ -135,7 +136,6 @@ import {
SignatureResponse,
TXSignatureResponse,
} from "./services/signing"
import { ReferrerStats } from "./services/doggo/db"
import {
migrateReduxState,
REDUX_STATE_VERSION,
Expand Down Expand Up @@ -327,7 +327,7 @@ export default class Main extends BaseService<never> {
internalEthereumProviderService,
preferenceService,
)
const doggoService = DoggoService.create(chainService, indexingService)
const islandService = IslandService.create(chainService, indexingService)

const telemetryService = TelemetryService.create()

Expand Down Expand Up @@ -399,7 +399,7 @@ export default class Main extends BaseService<never> {
await nameService,
await internalEthereumProviderService,
await providerBridgeService,
await doggoService,
await islandService,
await telemetryService,
await ledgerService,
await signingService,
Expand Down Expand Up @@ -458,7 +458,7 @@ export default class Main extends BaseService<never> {
* A promise to the claim service, which saves the eligibility data
* for efficient storage and retrieval.
*/
private doggoService: DoggoService,
private islandService: IslandService,
/**
* A promise to the telemetry service, which keeps track of extension
* storage usage and (eventually) other statistics.
Expand Down Expand Up @@ -602,7 +602,7 @@ export default class Main extends BaseService<never> {
this.nameService.startService(),
this.internalEthereumProviderService.startService(),
this.providerBridgeService.startService(),
this.doggoService.startService(),
this.islandService.startService(),
this.telemetryService.startService(),
this.ledgerService.startService(),
this.signingService.startService(),
Expand All @@ -625,7 +625,7 @@ export default class Main extends BaseService<never> {
this.nameService.stopService(),
this.internalEthereumProviderService.stopService(),
this.providerBridgeService.stopService(),
this.doggoService.stopService(),
this.islandService.stopService(),
this.telemetryService.stopService(),
this.ledgerService.stopService(),
this.signingService.stopService(),
Expand All @@ -647,7 +647,7 @@ export default class Main extends BaseService<never> {
this.connectProviderBridgeService()
this.connectPreferenceService()
this.connectEnrichmentService()
this.connectDoggoService()
this.connectIslandService()
this.connectTelemetryService()
this.connectLedgerService()
this.connectSigningService()
Expand Down Expand Up @@ -840,6 +840,9 @@ export default class Main extends BaseService<never> {
// Force a refresh of the account balance to populate the store.
this.chainService.getLatestBaseAccountBalance(addressNetwork)
})

// Set up Island Monitoring
await this.islandService.startMonitoringIfNeeded()
})

// Wire up chain service to account slice.
Expand Down Expand Up @@ -1584,14 +1587,14 @@ export default class Main extends BaseService<never> {

this.store.dispatch(clearSwapQuote())
this.store.dispatch(setEligibilityLoading())
this.doggoService.getEligibility(addressNetwork.address)
this.islandService.getEligibility(addressNetwork.address)

this.store.dispatch(setVaultsAsStale())

await this.chainService.markAccountActivity(addressNetwork)

const referrerStats =
await this.doggoService.getReferrerStats(addressNetwork)
await this.islandService.getReferrerStats(addressNetwork)
this.store.dispatch(setReferrerStats(referrerStats))

this.providerBridgeService.notifyContentScriptsAboutAddressChange(
Expand Down Expand Up @@ -1629,15 +1632,15 @@ export default class Main extends BaseService<never> {
})
}

async connectDoggoService(): Promise<void> {
this.doggoService.emitter.on(
async connectIslandService(): Promise<void> {
this.islandService.emitter.on(
"newEligibility",
async (eligibility: Eligible) => {
await this.store.dispatch(setEligibility(eligibility))
},
)

this.doggoService.emitter.on(
this.islandService.emitter.on(
"newReferral",
async (
referral: {
Expand All @@ -1660,6 +1663,10 @@ export default class Main extends BaseService<never> {
}
},
)

this.islandService.emitter.on("monitoringTestnetAsset", (asset) => {
this.store.dispatch(addIslandAsset(asset))
})
}

connectTelemetryService(): void {
Expand Down
2 changes: 1 addition & 1 deletion background/redux-slices/accounts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -423,7 +423,7 @@ const accountSlice = createSlice({
{ payload: asset }: { payload: SmartContractFungibleAsset },
) => {
const allAccounts = immerState.accountsData.evm[asset.homeNetwork.chainID]
Object.keys(allAccounts).forEach((address) => {
Object.keys(allAccounts ?? {}).forEach((address) => {
const account = allAccounts[address]
if (account !== "loading") {
Object.values(account.balances).forEach(({ assetAmount }) => {
Expand Down
72 changes: 68 additions & 4 deletions background/redux-slices/claim.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { createSlice, createSelector } from "@reduxjs/toolkit"
import { BigNumber, Signature, utils } from "ethers"
import { TransactionResponse } from "@ethersproject/abstract-provider"
import { Eligible } from "../services/doggo/types"
import { Eligible } from "../services/island/types"

import { createBackgroundAsyncThunk } from "./utils"
import { normalizeEVMAddress, truncateAddress } from "../lib/utils"
Expand All @@ -19,8 +19,17 @@ import DISTRIBUTOR_ABI from "./contract-abis/merkle-distributor"
import { DOGGO, HOUR } from "../constants"
import { FeatureFlags, isEnabled } from "../features"
import { ERC2612_INTERFACE } from "../lib/erc20"
import { ReferrerStats } from "../services/doggo/db"
import {
ReferrerStats,
TESTNET_TAHO,
VOTE_WITH_FRIENDS_ADDRESS,
} from "../services/island"
import { fromFixedPointNumber } from "../lib/fixed-point"
import { SmartContractFungibleAsset } from "../assets"
import { isSameAsset } from "./utils/asset-utils"
import { selectCurrentAccount } from "./selectors/uiSelectors"
import { AccountState } from "./accounts"
import { ISLAND_NETWORK } from "../services/island/contracts"

export interface DAO {
address: string
Expand All @@ -44,6 +53,7 @@ export interface Referrer {

interface ClaimingState {
status: string
islandAssets: SmartContractFungibleAsset[] | undefined
claimed: {
[address: HexString]: boolean
}
Expand All @@ -64,8 +74,6 @@ interface ClaimingState {
}

const DOGGO_TOKEN_ADDRESS = DOGGO.contractAddress
export const VOTE_WITH_FRIENDS_ADDRESS =
"0x0036B3a9D385Ce2CC072cf4A26dE29aE3283DEd0"

const getDistributorContract = async () => {
const distributorContractAddress = VOTE_WITH_FRIENDS_ADDRESS // VoteWithFriends contract address
Expand All @@ -78,6 +86,7 @@ const getDistributorContract = async () => {

const initialState: ClaimingState = {
status: "idle",
islandAssets: [],
claimed: {},
selectedForBonus: null,
selectedDelegate: null,
Expand Down Expand Up @@ -150,6 +159,16 @@ const claimingSlice = createSlice({
nonce,
expiry,
}),
addIslandAsset: (
immerState,
{ payload: asset }: { payload: SmartContractFungibleAsset },
) => {
if (immerState.islandAssets === undefined) {
immerState.islandAssets = [asset]
} else {
immerState.islandAssets.push(asset)
}
},
resetClaimFlow: (immerState) => {
immerState.signature = undefined
immerState.selectedForBonus = null
Expand Down Expand Up @@ -179,6 +198,7 @@ const claimingSlice = createSlice({
})

export const {
addIslandAsset,
chooseSelectedForBonus,
chooseDelegate,
setEligibility,
Expand Down Expand Up @@ -426,3 +446,47 @@ export const selectEligibilityLoading = createSelector(
(state: { claim: ClaimingState }): ClaimingState => state.claim,
(claimState: ClaimingState) => claimState.eligibilityLoading,
)

export const selectIsTestTahoDeployed = createSelector(
(state: { claim: ClaimingState }): ClaimingState => state.claim,
(claimState: ClaimingState) =>
claimState.islandAssets?.some((asset) =>
isSameAsset(asset, TESTNET_TAHO),
) ?? false,
)

export const selectHasIslandAssets = createSelector(
[
(state: { claim: ClaimingState }): ClaimingState => state.claim,
(state: { account: AccountState }): AccountState => state.account,
selectIsTestTahoDeployed,
selectCurrentAccount,
],
(claimState, accountState, isTahoDeployed, { address }) => {
const { islandAssets } = claimState

const currentAccountData =
accountState.accountsData.evm[ISLAND_NETWORK.chainID]?.[
normalizeEVMAddress(address)
]

if (
!isTahoDeployed ||
islandAssets === undefined ||
islandAssets.length === 0 ||
!currentAccountData ||
currentAccountData === "loading"
) {
return false
}

const balances = Object.values(currentAccountData?.balances ?? {})

const hasIslandAssets = islandAssets.some((islandAsset) =>
balances.some(({ assetAmount: { asset } }) =>
isSameAsset(asset, islandAsset),
),
)
return hasIslandAssets
},
)
11 changes: 7 additions & 4 deletions background/redux-slices/selectors/accountsSelectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
formatCurrencyAmount,
heuristicDesiredDecimalsForUnitPrice,
isNetworkBaseAsset,
isSameAsset,
isTrustedAsset,
} from "../utils/asset-utils"
import {
Expand Down Expand Up @@ -45,6 +46,7 @@ import { AccountSigner, SignerType } from "../../services/signing"
import { SignerImportSource } from "../../services/internal-signer"
import { assertUnreachable } from "../../lib/utils/type-guards"
import { PricesState, selectAssetPricePoint } from "../prices"
import { TESTNET_TAHO } from "../../services/island"

// TODO What actual precision do we want here? Probably more than 2
// TODO decimals? Maybe it's configurable?
Expand All @@ -64,11 +66,12 @@ export const userValueDustThreshold = 2
const shouldForciblyDisplayAsset = (
assetAmount: CompleteAssetAmount<AnyAsset>,
) => {
const isDoggo =
!isEnabled(FeatureFlags.HIDE_TOKEN_FEATURES) &&
assetAmount.asset.symbol === DOGGO.symbol
const isIslandRelated =
(!isEnabled(FeatureFlags.HIDE_TOKEN_FEATURES) &&
assetAmount.asset.symbol === DOGGO.symbol) ||
isSameAsset(assetAmount.asset, TESTNET_TAHO)

return isDoggo || isNetworkBaseAsset(assetAmount.asset)
return isIslandRelated || isNetworkBaseAsset(assetAmount.asset)
}

export function determineAssetDisplayAndVerify(
Expand Down
13 changes: 12 additions & 1 deletion background/services/chain/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ import {
} from "./utils/optimismGasPriceOracle"
import InternalSignerService, { SignerImportSource } from "../internal-signer"
import type { ValidatedAddEthereumChainParameter } from "../provider-bridge/utils"
import { ISLAND_NETWORK } from "../island/contracts"

// The number of blocks to query at a time for historic asset transfers.
// Unfortunately there's no "right" answer here that works well across different
Expand Down Expand Up @@ -875,10 +876,19 @@ export default class ChainService extends BaseService<Events> {
async getNetworksToTrack(): Promise<EVMNetwork[]> {
const chainIDs = await this.db.getChainIDsToTrack()
if (chainIDs.size === 0) {
// Default to tracking Ethereum so ENS resolution works during onboarding
// Ethereum - default to tracking Ethereum so ENS resolution works during onboarding
// Arbitrum Sepolia - default to tracking so we can support Island Dapp
if (isEnabled(FeatureFlags.SUPPORT_THE_ISLAND)) {
return [ETHEREUM, ISLAND_NETWORK]
}

return [ETHEREUM]
}

if (isEnabled(FeatureFlags.SUPPORT_THE_ISLAND)) {
chainIDs.add(ISLAND_NETWORK.chainID)
}

const networks = await Promise.all(
[...chainIDs].map(async (chainID) => {
const network = NETWORK_BY_CHAIN_ID[chainID]
Expand All @@ -888,6 +898,7 @@ export default class ChainService extends BaseService<Events> {
return network
}),
)

return networks.filter((network): network is EVMNetwork => !!network)
}

Expand Down
Loading

0 comments on commit ad45117

Please sign in to comment.