mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
* Version v10.18.4 * Fix default currency symbol for `wallet_addEthereumChain` + improve warnings for data that doesn't match our validation expectations (#15201) * set more appropriate default for ticker symbol when wallet_addEthereumChain is called * throw error to dapp when site suggests network with same chainId but different ticker symbol from already added network, instead of showing error and disabled notification to user * Fix Provider Tracking Metrics (#15082) * fix filetype audit (#15334) * Remove decentralized 4byte function signature registry since it contains incorrect signatures and we can't algorithmically check for best option when 4byte.directory is down (#15300) * remove decentralized 4byte function signature registry since it is griefed and we can't algorithmically check for best option when 4byte is down * add migration * remove nock of on chain registry call in getMethodDataAsync test * remove audit exclusion (#15346) * Updates `eth-lattice-keyring` to v0.10.0 (#15261) This is mainly associated with an update in GridPlus SDK and enables better strategies for fetching calldata decoder data. `eth-lattice-keyring` changes: GridPlus/eth-lattice-keyring@v0.7.3...v0.10.0 `gridplus-sdk` changes (which includes a codebase rewrite): GridPlus/gridplus-sdk@v1.2.3...v2.2.2 * Fix 'block link explorer on custom networks' (#13870) * Created a logic for the 'Add a block explorer URL' Removed unused message Message logic rollback Modified history push operation WIP: Pushing before rebasing Applied requested changes Removed unintenionally added code * Lint fix * Metrics fixed * Stop injecting provider on docs.google.com (#15459) * Fix setting of gasPrice when on non-eip 1559 networks (#15628) * Fix setting of gasPrice when on non-eip 1559 networks * Fix unit tests * Fix logic * Update ui/ducks/send/send.test.js Co-authored-by: Mark Stacey <markjstacey@gmail.com> Co-authored-by: Mark Stacey <markjstacey@gmail.com> * [GridPlus] Bumps `eth-lattice-keyring` to v0.11.0 (#15490) * [GridPlus] Bumps `gridplus-sdk` to v2.2.4 (#15561) * remove exclusions for mismatched object jsdoc type casing (#15351) * Improve `tokenId` parsing and clean up `useAssetDetails` hook (#15304) * Fix state creation in setupSentryGetStateGlobal (#15635) * filter breadcrumbs for improved clarity while debugging sentry errors (#15639) * Update v10.18.4 changelog (#15645) * Auto generated changelog * Update 10.18.4 changelog * Run lavamoat:auto * Call metrics event for wallet type selection at the right time (#15591) * Fix Sentry in LavaMoat contexts (#15672) Our Sentry setup relies upon application state, but it wasn't able to access it in LavaMoat builds because it's running in a separate Compartment. A patch has been introduced to the LavaMoat runtime to allow the root Compartment to mutate the `rootGlobals` object, which is accessible from outside the compartment as well. This lets us expose application state to our Sentry integration. * Fix Sentry deduplication of events that were never sent (#15677) The Sentry `Dedupe` integration has been filtering out our events, even when they were never sent due to our `beforeSend` handler. It was wrongly identifying them as duplicates because it has no knowledge of `beforeSend` or whether they were actually sent or not. To resolve this, the filtering we were doing in `beforeSend` has been moved to a Sentry integration. This integration is installed ahead of the `Dedupe` integration, so `Dedupe` should never find out about any events that we filter out, and thus will never consider them as sent when they were not. * Replace `lavamoat-runtime.js` patch (#15682) A patch made in #15672 was found to be unnecessary. Instead of setting a `rootGlobals` object upon construction of the root compartment, we are now creating a `sentryHooks` object in the initial top-level compartment. I hadn't realized at the time that the root compartment would inherit all properties of the initial compartment `globalThis`. This accomplishes the same goals as #15672 except without needing a patch. * Update v10.18.4 changelog * Fix lint issues * Update yarn.lock * Update `depcheck` to latest version (#15690) `depcheck` has been updated to the latest version. This version pins `@babel/parser` to v7.16.4 because of unresolved bugs in v7.16.5 that result in `depcheck` failing to parse TypeScript files correctly. We had a Yarn resolution in place to ensure `@babel/parser@7.16.4` was being used already. That resolution is no longer needed so it has been removed. This should resove the issue the dev team has been seeing lately where `yarn` and `yarn-deduplicate` disagree about the state the lockfile should be in. * Update yarn.lock * Update LavaMoat policy * deduplicate * Update LavaMoat build policy Co-authored-by: MetaMask Bot <metamaskbot@users.noreply.github.com> Co-authored-by: Alex Donesky <adonesky@gmail.com> Co-authored-by: Brad Decker <bhdecker84@gmail.com> Co-authored-by: Alex Miller <asmiller1989@gmail.com> Co-authored-by: Filip Sekulic <filip.sekulic@consensys.net> Co-authored-by: Erik Marks <25517051+rekmarks@users.noreply.github.com> Co-authored-by: Dan J Miller <danjm.com@gmail.com> Co-authored-by: Mark Stacey <markjstacey@gmail.com> Co-authored-by: seaona <54408225+seaona@users.noreply.github.com> Co-authored-by: seaona <mariona@gmx.es> Co-authored-by: PeterYinusa <peter.yinusa@consensys.net>
200 lines
6.3 KiB
JavaScript
200 lines
6.3 KiB
JavaScript
import log from 'loglevel';
|
|
|
|
import { SWAPS_API_V2_BASE_URL } from '../../../shared/constants/swaps';
|
|
import {
|
|
GOERLI_CHAIN_ID,
|
|
KOVAN_CHAIN_ID,
|
|
MAINNET_CHAIN_ID,
|
|
RINKEBY_CHAIN_ID,
|
|
ROPSTEN_CHAIN_ID,
|
|
BUYABLE_CHAINS_MAP,
|
|
} from '../../../shared/constants/network';
|
|
import { SECOND } from '../../../shared/constants/time';
|
|
import getFetchWithTimeout from '../../../shared/modules/fetch-with-timeout';
|
|
import {
|
|
TRANSAK_API_KEY,
|
|
MOONPAY_API_KEY,
|
|
COINBASEPAY_API_KEY,
|
|
} from '../constants/on-ramp';
|
|
|
|
const fetchWithTimeout = getFetchWithTimeout(SECOND * 30);
|
|
|
|
/**
|
|
* Create a Wyre purchase URL.
|
|
*
|
|
* @param {string} walletAddress - Ethereum destination address
|
|
* @param {string} chainId - Current chain ID
|
|
* @returns String
|
|
*/
|
|
const createWyrePurchaseUrl = async (walletAddress, chainId) => {
|
|
const { wyre = {} } = BUYABLE_CHAINS_MAP[chainId];
|
|
const { srn, currencyCode } = wyre;
|
|
|
|
const networkId = parseInt(chainId, 16);
|
|
const fiatOnRampUrlApi = `${SWAPS_API_V2_BASE_URL}/networks/${networkId}/fiatOnRampUrl?serviceName=wyre&destinationAddress=${walletAddress}`;
|
|
const wyrePurchaseUrlFallback = `https://pay.sendwyre.com/purchase?dest=${srn}:${walletAddress}&destCurrency=${currencyCode}&accountId=AC-7AG3W4XH4N2&paymentMethod=debit-card`;
|
|
try {
|
|
const response = await fetchWithTimeout(fiatOnRampUrlApi, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
},
|
|
});
|
|
const parsedResponse = await response.json();
|
|
if (response.ok && parsedResponse.url) {
|
|
return parsedResponse.url;
|
|
}
|
|
log.warn('Failed to create a Wyre purchase URL', parsedResponse);
|
|
} catch (err) {
|
|
log.warn('Failed to create a Wyre purchase URL', err);
|
|
}
|
|
return wyrePurchaseUrlFallback; // In case the API call would fail, we return a fallback URL for Wyre's Checkout.
|
|
};
|
|
|
|
/**
|
|
* Create a Transak Checkout URL.
|
|
* API docs here: https://www.notion.so/Query-Parameters-9ec523df3b874ec58cef4fa3a906f238
|
|
*
|
|
* @param {string} walletAddress - Ethereum destination address
|
|
* @param {string} chainId - Current chain ID
|
|
* @returns String
|
|
*/
|
|
const createTransakUrl = (walletAddress, chainId) => {
|
|
const { transakCurrencies, network } = BUYABLE_CHAINS_MAP[chainId];
|
|
|
|
const queryParams = new URLSearchParams({
|
|
apiKey: TRANSAK_API_KEY,
|
|
hostURL: 'https://metamask.io',
|
|
cryptoCurrencyList: transakCurrencies.join(','),
|
|
defaultCryptoCurrency: transakCurrencies[0],
|
|
networks: network,
|
|
walletAddress,
|
|
});
|
|
|
|
return `https://global.transak.com/?${queryParams}`;
|
|
};
|
|
|
|
/**
|
|
* Create a MoonPay Checkout URL.
|
|
*
|
|
* @param {string} walletAddress - Destination address
|
|
* @param {string} chainId - Current chain ID
|
|
* @returns String
|
|
*/
|
|
const createMoonPayUrl = async (walletAddress, chainId) => {
|
|
const {
|
|
moonPay: { defaultCurrencyCode, showOnlyCurrencies } = {},
|
|
} = BUYABLE_CHAINS_MAP[chainId];
|
|
const moonPayQueryParams = new URLSearchParams({
|
|
apiKey: MOONPAY_API_KEY,
|
|
walletAddress,
|
|
defaultCurrencyCode,
|
|
showOnlyCurrencies,
|
|
});
|
|
const queryParams = new URLSearchParams({
|
|
url: `https://buy.moonpay.com?${moonPayQueryParams}`,
|
|
context: 'extension',
|
|
});
|
|
const moonPaySignUrl = `${SWAPS_API_V2_BASE_URL}/moonpaySign/?${queryParams}`;
|
|
try {
|
|
const response = await fetchWithTimeout(moonPaySignUrl, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
},
|
|
});
|
|
const parsedResponse = await response.json();
|
|
if (response.ok && parsedResponse.url) {
|
|
return parsedResponse.url;
|
|
}
|
|
log.warn('Failed to create a MoonPay purchase URL', parsedResponse);
|
|
} catch (err) {
|
|
log.warn('Failed to create a MoonPay purchase URL', err);
|
|
}
|
|
return '';
|
|
};
|
|
|
|
/**
|
|
* Create a Coinbase Pay Checkout URL.
|
|
*
|
|
* @param {string} walletAddress - Ethereum destination address
|
|
* @param {string} chainId - Current chain ID
|
|
* @returns String
|
|
*/
|
|
const createCoinbasePayUrl = (walletAddress, chainId) => {
|
|
const { coinbasePayCurrencies } = BUYABLE_CHAINS_MAP[chainId];
|
|
const queryParams = new URLSearchParams({
|
|
appId: COINBASEPAY_API_KEY,
|
|
attribution: 'extension',
|
|
destinationWallets: JSON.stringify([
|
|
{
|
|
address: walletAddress,
|
|
assets: coinbasePayCurrencies,
|
|
},
|
|
]),
|
|
});
|
|
return `https://pay.coinbase.com/buy?${queryParams}`;
|
|
};
|
|
|
|
/**
|
|
* Gives the caller a url at which the user can acquire eth, depending on the network they are in
|
|
*
|
|
* @param {object} opts - Options required to determine the correct url
|
|
* @param {string} opts.chainId - The chainId for which to return a url
|
|
* @param {string} opts.address - The address the bought ETH should be sent to. Only relevant if chainId === '0x1'.
|
|
* @param opts.service
|
|
* @returns {string|undefined} The url at which the user can access ETH, while in the given chain. If the passed
|
|
* chainId does not match any of the specified cases, or if no chainId is given, returns undefined.
|
|
*/
|
|
export default async function getBuyUrl({ chainId, address, service }) {
|
|
// default service by network if not specified
|
|
if (!service) {
|
|
// eslint-disable-next-line no-param-reassign
|
|
service = getDefaultServiceForChain(chainId);
|
|
}
|
|
|
|
switch (service) {
|
|
case 'wyre':
|
|
return await createWyrePurchaseUrl(address, chainId);
|
|
case 'transak':
|
|
return createTransakUrl(address, chainId);
|
|
case 'moonpay':
|
|
return createMoonPayUrl(address, chainId);
|
|
case 'coinbase':
|
|
return createCoinbasePayUrl(address, chainId);
|
|
case 'metamask-faucet':
|
|
return 'https://faucet.metamask.io/';
|
|
case 'rinkeby-faucet':
|
|
return 'https://www.rinkeby.io/';
|
|
case 'kovan-faucet':
|
|
return 'https://github.com/kovan-testnet/faucet';
|
|
case 'goerli-faucet':
|
|
return 'https://goerli-faucet.slock.it/';
|
|
default:
|
|
throw new Error(
|
|
`Unknown cryptocurrency exchange or faucet: "${service}"`,
|
|
);
|
|
}
|
|
}
|
|
|
|
function getDefaultServiceForChain(chainId) {
|
|
switch (chainId) {
|
|
case MAINNET_CHAIN_ID:
|
|
return 'wyre';
|
|
case ROPSTEN_CHAIN_ID:
|
|
return 'metamask-faucet';
|
|
case RINKEBY_CHAIN_ID:
|
|
return 'rinkeby-faucet';
|
|
case KOVAN_CHAIN_ID:
|
|
return 'kovan-faucet';
|
|
case GOERLI_CHAIN_ID:
|
|
return 'goerli-faucet';
|
|
default:
|
|
throw new Error(
|
|
`No default cryptocurrency exchange or faucet for chainId: "${chainId}"`,
|
|
);
|
|
}
|
|
}
|