-
Notifications
You must be signed in to change notification settings - Fork 47
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor(portfolio): refactor portfolio balance for pt
- Loading branch information
1 parent
923880b
commit 7a19318
Showing
29 changed files
with
701 additions
and
357 deletions.
There are no files selected for viewing
49 changes: 49 additions & 0 deletions
49
apps/wallet-mobile/src/features/Portfolio/common/transformers.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
import {parseTokenId} from '@yoroi/portfolio' | ||
import {Chain, Portfolio} from '@yoroi/types' | ||
import {freeze} from 'immer' | ||
|
||
import {NetworkId, RawUtxo, RemoteAsset} from '../../../yoroi-wallets/types' | ||
|
||
export function toChainSupportedNetwork(networkId: NetworkId): Chain.SupportedNetworks { | ||
switch (networkId) { | ||
case 0: | ||
case 1: | ||
return Chain.Network.Main | ||
case 450: | ||
return Chain.Network.Sancho | ||
default: | ||
return Chain.Network.Preprod | ||
} | ||
} | ||
|
||
export function toBalanceManagerArgs(rawUtxos: RawUtxo[]) { | ||
let ptBalance = 0n | ||
const secondary = new Map<Portfolio.Token.Id, Omit<Portfolio.Token.Balance, 'info'>>() | ||
for (const utxo of rawUtxos) { | ||
ptBalance += BigInt(utxo.amount) | ||
for (const record of utxo.assets) { | ||
const tokenId = toTokenId(record.assetId) | ||
if (!tokenId) continue // skip invalid token ids | ||
secondary.set(tokenId, { | ||
balance: secondary.get(tokenId)?.balance ?? 0n + BigInt(record.amount), | ||
}) | ||
} | ||
} | ||
|
||
return freeze( | ||
{ | ||
primaryBalance: { | ||
balance: ptBalance, | ||
minRequiredByTokens: 0n, | ||
lockedInBuiltTxs: 0n, | ||
records: [], | ||
}, | ||
secondaryBalances: new Map(secondary), | ||
}, | ||
true, | ||
) | ||
} | ||
|
||
const toTokenId = (assetId: RemoteAsset['assetId']) => { | ||
return parseTokenId(`${assetId.slice(0, 56)}.${assetId.slice(56)}`) | ||
} |
119 changes: 73 additions & 46 deletions
119
apps/wallet-mobile/src/features/Portfolio/common/usePortfolioBalanceManager.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,73 +1,100 @@ | ||
import {mountMMKVStorage, observableStorageMaker} from '@yoroi/common' | ||
import {createPrimaryTokenInfo, portfolioBalanceManagerMaker, portfolioBalanceStorageMaker} from '@yoroi/portfolio' | ||
import {Portfolio} from '@yoroi/types' | ||
import {Chain, Portfolio} from '@yoroi/types' | ||
import * as React from 'react' | ||
|
||
import {YoroiWallet} from '../../../yoroi-wallets/cardano/types' | ||
|
||
export const usePortfolioBalanceManager = ({ | ||
tokenManager, | ||
walletId, | ||
network, | ||
}: { | ||
tokenManager: Portfolio.Manager.Token | ||
walletId: YoroiWallet['id'] | ||
network: Chain.Network | ||
}) => { | ||
return React.useMemo(() => { | ||
const balanceStorageMounted = mountMMKVStorage<Portfolio.Token.Id>({path: `balance/${walletId}/`}) | ||
const primaryBreakdownStorageMounted = mountMMKVStorage<Portfolio.Token.Id>({ | ||
path: `/primary-breakdown/${walletId}/`, | ||
}) | ||
return React.useMemo( | ||
() => buildPortfolioBalanceManager({tokenManager, walletId, network}), | ||
[network, tokenManager, walletId], | ||
) | ||
} | ||
|
||
export const buildPortfolioBalanceManager = ({ | ||
tokenManager, | ||
walletId, | ||
network, | ||
}: { | ||
tokenManager: Portfolio.Manager.Token | ||
walletId: YoroiWallet['id'] | ||
network: Chain.Network | ||
}) => { | ||
const primaryTokenInfo = network === Chain.Network.Main ? primaryTokenInfoMainnet : primaryTokenInfoAnyTestnet | ||
const balanceStorageMounted = mountMMKVStorage<Portfolio.Token.Id>({path: `/balance/${walletId}/`}) | ||
const primaryBreakdownStorageMounted = mountMMKVStorage<Portfolio.Token.Id>({ | ||
path: `/primary-breakdown/${walletId}/`, | ||
}) | ||
|
||
const balanceStorage = portfolioBalanceStorageMaker({ | ||
balanceStorage: observableStorageMaker(balanceStorageMounted), | ||
primaryBreakdownStorage: observableStorageMaker(primaryBreakdownStorageMounted), | ||
}) | ||
const balanceStorage = portfolioBalanceStorageMaker({ | ||
balanceStorage: observableStorageMaker(balanceStorageMounted), | ||
primaryBreakdownStorage: observableStorageMaker(primaryBreakdownStorageMounted), | ||
}) | ||
|
||
const balanceManager = portfolioBalanceManagerMaker({ | ||
tokenManager, | ||
storage: balanceStorage, | ||
primaryToken: { | ||
info: primaryTokenInfo, | ||
discovery: { | ||
counters: { | ||
items: 0, | ||
supply: 0n, | ||
totalItems: 0, | ||
}, | ||
id: primaryTokenInfo.id, | ||
originalMetadata: { | ||
filteredMintMetadatum: null, | ||
referenceDatum: null, | ||
tokenRegistry: null, | ||
}, | ||
properties: {}, | ||
source: { | ||
decimals: Portfolio.Token.Source.Metadata, | ||
name: Portfolio.Token.Source.Metadata, | ||
ticker: Portfolio.Token.Source.Metadata, | ||
symbol: Portfolio.Token.Source.Metadata, | ||
image: Portfolio.Token.Source.Metadata, | ||
}, | ||
const balanceManager = portfolioBalanceManagerMaker({ | ||
tokenManager, | ||
storage: balanceStorage, | ||
primaryToken: { | ||
info: primaryTokenInfo, | ||
discovery: { | ||
counters: { | ||
items: 0, | ||
supply: 45n * BigInt(1e9), | ||
totalItems: 0, | ||
}, | ||
id: primaryTokenInfo.id, | ||
originalMetadata: { | ||
filteredMintMetadatum: null, | ||
referenceDatum: null, | ||
tokenRegistry: null, | ||
}, | ||
properties: {}, | ||
source: { | ||
decimals: Portfolio.Token.Source.Metadata, | ||
name: Portfolio.Token.Source.Metadata, | ||
ticker: Portfolio.Token.Source.Metadata, | ||
symbol: Portfolio.Token.Source.Metadata, | ||
image: Portfolio.Token.Source.Metadata, | ||
}, | ||
}, | ||
sourceId: walletId, | ||
}) | ||
}, | ||
sourceId: walletId, | ||
}) | ||
|
||
balanceManager.hydrate() | ||
return { | ||
balanceManager, | ||
balanceStorage, | ||
} | ||
}, [tokenManager, walletId]) | ||
balanceManager.hydrate() | ||
return { | ||
balanceManager, | ||
balanceStorage, | ||
} | ||
} | ||
|
||
const primaryTokenInfo = createPrimaryTokenInfo({ | ||
const primaryTokenInfoMainnet = createPrimaryTokenInfo({ | ||
decimals: 6, | ||
name: 'ADA', | ||
ticker: 'ADA', | ||
symbol: '$', | ||
symbol: '₳', | ||
reference: '', | ||
tag: '', | ||
website: 'https://www.cardano.org/', | ||
originalImage: '', | ||
}) | ||
|
||
const primaryTokenInfoAnyTestnet = createPrimaryTokenInfo({ | ||
decimals: 6, | ||
name: 'TADA', | ||
ticker: 'TADA', | ||
symbol: '₳', | ||
reference: '', | ||
tag: '', | ||
website: '', | ||
website: 'https://www.cardano.org/', | ||
originalImage: '', | ||
}) |
68 changes: 48 additions & 20 deletions
68
apps/wallet-mobile/src/features/Portfolio/common/usePortfolioTokenManager.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,27 +1,55 @@ | ||
import {mountMMKVStorage, observableStorageMaker} from '@yoroi/common' | ||
import {portfolioApiMaker, portfolioTokenManagerMaker, portfolioTokenStorageMaker} from '@yoroi/portfolio' | ||
import {Chain, Portfolio} from '@yoroi/types' | ||
import {freeze} from 'immer' | ||
import * as React from 'react' | ||
|
||
export const usePortfolioTokenManager = ({network}: {network: Chain.Network}) => { | ||
return React.useMemo(() => { | ||
const tokenDiscoveryStorageMounted = mountMMKVStorage<Portfolio.Token.Id>({path: `${network}/token-discovery/`}) | ||
const tokenInfoStorageMounted = mountMMKVStorage<Portfolio.Token.Id>({path: `${network}/token-info/`}) | ||
|
||
const tokenStorage = portfolioTokenStorageMaker({ | ||
tokenDiscoveryStorage: observableStorageMaker(tokenDiscoveryStorageMounted), | ||
tokenInfoStorage: observableStorageMaker(tokenInfoStorageMounted), | ||
}) | ||
const api = portfolioApiMaker({ | ||
network, | ||
}) | ||
|
||
const tokenManager = portfolioTokenManagerMaker({ | ||
api, | ||
storage: tokenStorage, | ||
}) | ||
|
||
tokenManager.hydrate({sourceId: 'initial'}) | ||
return {tokenManager, tokenStorage} | ||
}, [network]) | ||
return React.useMemo(() => buildPortfolioTokenManager({network}), [network]) | ||
} | ||
|
||
export const buildPortfolioTokenManager = ({network}: {network: Chain.Network}) => { | ||
const tokenDiscoveryStorageMounted = mountMMKVStorage<Portfolio.Token.Id>({path: `${network}/token-discovery/`}) | ||
const tokenInfoStorageMounted = mountMMKVStorage<Portfolio.Token.Id>({path: `${network}/token-info/`}) | ||
|
||
const tokenStorage = portfolioTokenStorageMaker({ | ||
tokenDiscoveryStorage: observableStorageMaker(tokenDiscoveryStorageMounted), | ||
tokenInfoStorage: observableStorageMaker(tokenInfoStorageMounted), | ||
}) | ||
const api = portfolioApiMaker({ | ||
network, | ||
}) | ||
|
||
const tokenManager = portfolioTokenManagerMaker({ | ||
api, | ||
storage: tokenStorage, | ||
}) | ||
|
||
tokenManager.hydrate({sourceId: 'initial'}) | ||
return {tokenManager, tokenStorage} | ||
} | ||
|
||
export const buildPortfolioTokenManagers = () => { | ||
const mainnetPortfolioTokenManager = buildPortfolioTokenManager({network: Chain.Network.Main}) | ||
const preprodPortfolioTokenManager = buildPortfolioTokenManager({network: Chain.Network.Preprod}) | ||
const sanchoPortfolioTokenManager = buildPortfolioTokenManager({network: Chain.Network.Sancho}) | ||
|
||
mainnetPortfolioTokenManager.tokenManager.hydrate({sourceId: 'initial'}) | ||
preprodPortfolioTokenManager.tokenManager.hydrate({sourceId: 'initial'}) | ||
sanchoPortfolioTokenManager.tokenManager.hydrate({sourceId: 'initial'}) | ||
|
||
const tokenManagers: Readonly<{ | ||
[Chain.Network.Main]: Portfolio.Manager.Token | ||
[Chain.Network.Preprod]: Portfolio.Manager.Token | ||
[Chain.Network.Sancho]: Portfolio.Manager.Token | ||
}> = freeze( | ||
{ | ||
[Chain.Network.Main]: mainnetPortfolioTokenManager.tokenManager, | ||
[Chain.Network.Preprod]: preprodPortfolioTokenManager.tokenManager, | ||
[Chain.Network.Sancho]: sanchoPortfolioTokenManager.tokenManager, | ||
}, | ||
true, | ||
) | ||
|
||
return tokenManagers | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.