Skip to content

Commit

Permalink
Update assets controllers to version 22 - OpenSea V2 (#22324)
Browse files Browse the repository at this point in the history
Updates the assets controllers package to version 22.0.0. This brings in
[PR 3654](MetaMask/core#3654) to migrate from
OpenSea V1 to V2 API.

Fixes: MetaMask/MetaMask-planning#1841

1. Import a wallet containing NFTs on mainnet
2. Manually import an NFT owner by the wallet, verify it appears
3. Enable NFT autodetection in settings, verify the rest of the NFTs
appear
4. Verify descriptions, collection/token images are correct
5. Send an NFT, verify it works

No visible differences

- [x] I’ve followed [MetaMask Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've clearly explained what problem this PR is solving and how it
is solved.
- [x] I've linked related issues
- [x] I've included manual testing steps
- [ ] I've included screenshots/recordings if applicable
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.
- [x] I’ve properly set the pull request status:
  - [ ] In case it's not yet "ready for review", I've set it to "draft".
- [x] In case it's "ready for review", I've changed it from "draft" to
"non-draft".

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
  • Loading branch information
bergeron authored and danjm committed Dec 22, 2023
1 parent 0d8b6f4 commit e07e307
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 247 deletions.
1 change: 1 addition & 0 deletions app/scripts/metamask-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,7 @@ export default class MetamaskController extends EventEmitter {
this.assetsContractController,
),
addNft: this.nftController.addNft.bind(this.nftController),
getNftApi: this.nftController.getNftApi.bind(this.nftController),
getNftState: () => this.nftController.state,
});

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@
"@metamask/address-book-controller": "^3.0.0",
"@metamask/announcement-controller": "^4.0.0",
"@metamask/approval-controller": "^3.4.0",
"@metamask/assets-controllers": "^21.0.0",
"@metamask/assets-controllers": "^22.0.0",
"@metamask/base-controller": "^3.2.0",
"@metamask/browser-passworder": "^4.1.0",
"@metamask/contract-metadata": "^2.3.1",
Expand Down
294 changes: 54 additions & 240 deletions test/e2e/tests/nft/mocks.js
Original file line number Diff line number Diff line change
@@ -1,279 +1,93 @@
function setupAutoDetectMocking(server) {
const assets = {
assets: [
const nfts = {
nfts: [
{
id: 29383543,
token_id:
identifier:
'86818186862637897590416402377730948900221574858925543698968316530334305793541',
num_sales: 0,
background_color: null,
image_url: 'https://metamask.github.io/test-dapp/metamask-fox.svg', // 'https://openseauserdata.com/files/ed6a6e7598980ee8ef8e5a08ea0304c9.svg',
image_preview_url:
'https://metamask.github.io/test-dapp/metamask-fox.svg', // 'https://openseauserdata.com/files/ed6a6e7598980ee8ef8e5a08ea0304c9.svg',
image_thumbnail_url:
'https://metamask.github.io/test-dapp/metamask-fox.svg', // 'https://openseauserdata.com/files/ed6a6e7598980ee8ef8e5a08ea0304c9.svg',
image_original_url:
'https://metadata.ens.domains/mainnet/0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85/0xbff15a37063625e314d681fa9d4099080b40fcc7dc2bd4a338a0b5ecb24eb605/image',
animation_url: null,
animation_original_url: null,
collection: 'ens',
contract: '0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85',
token_standard: 'erc721',
name: 'peteryinusa.eth',
description: 'peteryinusa.eth, an ENS name.',
external_link: 'https://app.ens.domains/name/peteryinusa.eth',
asset_contract: {
address: '0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85',
asset_contract_type: 'non-fungible',
chain_identifier: 'ethereum',
created_date: '2019-05-08T21:59:29.327544',
name: 'Unidentified contract',
nft_version: null,
opensea_version: null,
owner: 111982386,
schema_name: 'ERC721',
symbol: '',
total_supply: '0',
description:
'Ethereum Name Service (ENS) domains are secure domain names for the decentralized world. ENS domains provide a way for users to map human readable names to blockchain and non-blockchain resources, like Ethereum addresses, IPFS hashes, or website URLs. ENS domains can be bought and sold on secondary markets.',
external_link: 'https://ens.domains',
image_url: 'https://metamask.github.io/test-dapp/metamask-fox.svg', // 'https://i.seadn.io/gae/0cOqWoYA7xL9CkUjGlxsjreSYBdrUBE0c6EO1COG4XE8UeP-Z30ckqUNiL872zHQHQU5MUNMNhfDpyXIP17hRSC5HQ?w=500&auto=format',
default_to_fiat: false,
dev_buyer_fee_basis_points: 0,
dev_seller_fee_basis_points: 0,
only_proxied_transfers: false,
opensea_buyer_fee_basis_points: 0,
opensea_seller_fee_basis_points: 250,
buyer_fee_basis_points: 0,
seller_fee_basis_points: 250,
payout_address: null,
},
permalink:
'https://opensea.io/assets/ethereum/0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85/86818186862637897590416402377730948900221574858925543698968316530334305793541',
collection: {
banner_image_url: null,
chat_url: null,
created_date: '2019-05-08T21:59:36.282454+00:00',
default_to_fiat: false,
description:
'Ethereum Name Service (ENS) domains are secure domain names for the decentralized world. ENS domains provide a way for users to map human readable names to blockchain and non-blockchain resources, like Ethereum addresses, IPFS hashes, or website URLs. ENS domains can be bought and sold on secondary markets.',
dev_buyer_fee_basis_points: '0',
dev_seller_fee_basis_points: '0',
discord_url: null,
display_data: {
card_display_style: 'cover',
},
external_url: 'https://ens.domains',
featured: false,
featured_image_url:
'https://i.seadn.io/gae/BBj09xD7R4bBtg1lgnAAS9_TfoYXKwMtudlk-0fVljlURaK7BWcARCpkM-1LGNGTAcsGO6V1TgrtmQFvCo8uVYW_QEfASK-9j6Nr?w=500&auto=format',
hidden: false,
safelist_request_status: 'verified',
image_url: 'https://metamask.github.io/test-dapp/metamask-fox.svg', // 'https://i.seadn.io/gae/0cOqWoYA7xL9CkUjGlxsjreSYBdrUBE0c6EO1COG4XE8UeP-Z30ckqUNiL872zHQHQU5MUNMNhfDpyXIP17hRSC5HQ?w=500&auto=format',
is_subject_to_whitelist: false,
large_image_url:
'https://i.seadn.io/gae/BBj09xD7R4bBtg1lgnAAS9_TfoYXKwMtudlk-0fVljlURaK7BWcARCpkM-1LGNGTAcsGO6V1TgrtmQFvCo8uVYW_QEfASK-9j6Nr?w=500&auto=format',
medium_username: 'the-ethereum-name-service',
name: 'ENS: Ethereum Name Service',
only_proxied_transfers: false,
opensea_buyer_fee_basis_points: '0',
opensea_seller_fee_basis_points: 250,
payout_address: null,
require_email: false,
short_description: null,
slug: 'ens',
telegram_url: null,
twitter_username: 'ensdomains',
instagram_username: null,
wiki_url: null,
is_nsfw: false,
fees: {
seller_fees: {},
opensea_fees: {
'0x0000a26b00c1f0df003000390027140000faa719': 250,
},
},
is_rarity_enabled: false,
is_creator_fees_enforced: false,
},
decimals: null,
token_metadata:
image_url: 'https://metamask.github.io/test-dapp/metamask-fox.svg',
metadata_url:
'https://metadata.ens.domains/mainnet/0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85/86818186862637897590416402377730948900221574858925543698968316530334305793541',
opensea_url:
'https://opensea.io/assets/ethereum/0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85/86818186862637897590416402377730948900221574858925543698968316530334305793541',
created_at: ' ',
updated_at: '2022-07-02T19:30:43.023572',
is_disabled: false,
is_nsfw: false,
owner: null,
seaport_sell_orders: null,
creator: {
user: {
username: 'ENSDeployer',
},
address: '0x4fe4e666be5752f1fdd210f4ab5de2cc26e3e0e8',
config: 'verified',
profile_img_url: '',
},
traits: [
{
trait_type: 'Length',
display_type: 'number',
max_value: null,
trait_count: 93526,
order: null,
value: 11,
},
{
trait_type: 'Segment Length',
display_type: 'number',
max_value: null,
trait_count: 22322,
order: null,
value: 11,
},
{
trait_type: 'Character Set',
display_type: null,
max_value: null,
trait_count: 233279,
order: null,
value: 'letter',
},
{
trait_type: 'Created Date',
display_type: 'date',
max_value: null,
trait_count: 1,
order: null,
value: 1624394771.0,
},
{
trait_type: 'Registration Date',
display_type: 'date',
max_value: null,
trait_count: 1,
order: null,
value: 1624394771.0,
},
{
trait_type: 'Expiration Date',
display_type: 'date',
max_value: null,
trait_count: 1,
order: null,
value: 1687508675.0,
},
],
last_sale: null,
top_bid: null,
listing_date: null,
supports_wyvern: true,
rarity_data: null,
transfer_fee: null,
transfer_fee_payment_token: null,
},
],
};
const assetEmpty = {
assets: [],
};
const assetContract = {
collection: {
banner_image_url: null,
chat_url: null,
created_date: '2019-05-08T21:59:36.282454+00:00',
default_to_fiat: false,
description:
'Ethereum Name Service (ENS) domains are secure domain names for the decentralized world. ENS domains provide a way for users to map human readable names to blockchain and non-blockchain resources, like Ethereum addresses, IPFS hashes, or website URLs. ENS domains can be bought and sold on secondary markets.',
dev_buyer_fee_basis_points: '0',
dev_seller_fee_basis_points: '0',
discord_url: null,
display_data: {
card_display_style: 'cover',
},
external_url: 'https://ens.domains',
featured: false,
featured_image_url:
'https://i.seadn.io/gae/BBj09xD7R4bBtg1lgnAAS9_TfoYXKwMtudlk-0fVljlURaK7BWcARCpkM-1LGNGTAcsGO6V1TgrtmQFvCo8uVYW_QEfASK-9j6Nr?w=500&auto=format',
hidden: false,
safelist_request_status: 'verified',
image_url: 'https://metamask.github.io/test-dapp/metamask-fox.svg', // 'https://i.seadn.io/gae/0cOqWoYA7xL9CkUjGlxsjreSYBdrUBE0c6EO1COG4XE8UeP-Z30ckqUNiL872zHQHQU5MUNMNhfDpyXIP17hRSC5HQ?w=500&auto=format',
is_subject_to_whitelist: false,
large_image_url:
'https://i.seadn.io/gae/BBj09xD7R4bBtg1lgnAAS9_TfoYXKwMtudlk-0fVljlURaK7BWcARCpkM-1LGNGTAcsGO6V1TgrtmQFvCo8uVYW_QEfASK-9j6Nr?w=500&auto=format',
medium_username: 'the-ethereum-name-service',
name: 'ENS: Ethereum Name Service',
only_proxied_transfers: false,
opensea_buyer_fee_basis_points: '0',
opensea_seller_fee_basis_points: 250,
payout_address: null,
require_email: false,
short_description: null,
slug: 'ens',
telegram_url: null,
twitter_username: 'ensdomains',
instagram_username: null,
wiki_url: null,
is_nsfw: false,
fees: {
seller_fees: {},
opensea_fees: {
'0x0000a26b00c1f0df003000390027140000faa719': 250,
},
},
is_rarity_enabled: false,
is_creator_fees_enforced: false,
},

const nftContract = {
address: '0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85',
asset_contract_type: 'non-fungible',
chain_identifier: 'ethereum',
created_date: '2019-05-08T21:59:29.327544',
chain: 'ethereum',
collection: 'ens',
contract_standard: 'erc721',
name: 'Unidentified contract',
nft_version: null,
opensea_version: null,
owner: 111982386,
schema_name: 'ERC721',
symbol: '',
total_supply: '0',
supply: 0,
};

const nftCollection = {
collection: 'ens',
name: 'ENS: Ethereum Name Service',
description:
'Ethereum Name Service (ENS) domains are secure domain names for the decentralized world. ENS domains provide a way for users to map human readable names to blockchain and non-blockchain resources, like Ethereum addresses, IPFS hashes, or website URLs. ENS domains can be bought and sold on secondary markets.',
external_link: 'https://ens.domains',
image_url: 'https://metamask.github.io/test-dapp/metamask-fox.svg', // 'https://i.seadn.io/gae/0cOqWoYA7xL9CkUjGlxsjreSYBdrUBE0c6EO1COG4XE8UeP-Z30ckqUNiL872zHQHQU5MUNMNhfDpyXIP17hRSC5HQ?w=500&auto=format',
default_to_fiat: false,
dev_buyer_fee_basis_points: 0,
dev_seller_fee_basis_points: 0,
only_proxied_transfers: false,
opensea_buyer_fee_basis_points: 0,
opensea_seller_fee_basis_points: 250,
buyer_fee_basis_points: 0,
seller_fee_basis_points: 250,
payout_address: null,
image_url: 'https://metamask.github.io/test-dapp/metamask-fox.svg',
banner_image_url: '',
owner: '0xfe89cc7abb2c4183683ab71653c4cdc9b02d44b7',
safelist_status: 'verified',
category: 'domain-names',
is_disabled: false,
is_nsfw: false,
trait_offers_enabled: false,
collection_offers_enabled: false,
opensea_url: 'https://opensea.io/collection/ens',
project_url: 'https://ens.domains',
wiki_url: '',
discord_url: '',
telegram_url: '',
twitter_username: 'ensdomains',
instagram_username: '',
};

// Get assets for owner
// Get assets for account
server
.forGet('https://proxy.metafi.codefi.network/opensea/v1/api/v1/assets')
.withQuery({ offset: 0 })
.forGet(
'https://proxy.metafi.codefi.network/opensea/v1/api/v2/chain/ethereum/account/0x5cfe73b6021e818b776b421b1c4db2474086a7e1/nfts',
)
.withQuery({ limit: 200, next: '' })
.thenCallback(() => {
return {
statusCode: 200,
json: assets,
json: nfts,
};
});

// Get assets for owner continued
// Get contract
server
.forGet('https://proxy.metafi.codefi.network/opensea/v1/api/v1/assets')
.withQuery({ offset: 50 })
.forGet(
'https://proxy.metafi.codefi.network/opensea/v1/api/v2/chain/ethereum/contract/0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85',
)
.thenCallback(() => {
return {
statusCode: 200,
json: assetEmpty,
json: nftContract,
};
});

// Get asset contract details
// Get collection
server
.forGet(
'https://proxy.metafi.codefi.network/opensea/v1/api/v1/asset_contract/0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85',
'https://proxy.metafi.codefi.network/opensea/v1/api/v2/collections/ens',
)
.thenCallback(() => {
return {
statusCode: 200,
json: assetContract,
json: nftCollection,
};
});

Expand Down
12 changes: 6 additions & 6 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3835,9 +3835,9 @@ __metadata:
languageName: node
linkType: hard

"@metamask/assets-controllers@npm:^21.0.0":
version: 21.0.0
resolution: "@metamask/assets-controllers@npm:21.0.0"
"@metamask/assets-controllers@npm:^22.0.0":
version: 22.0.0
resolution: "@metamask/assets-controllers@npm:22.0.0"
dependencies:
"@ethersproject/address": "npm:^5.7.0"
"@ethersproject/bignumber": "npm:^5.7.0"
Expand All @@ -3847,7 +3847,7 @@ __metadata:
"@metamask/approval-controller": "npm:^5.0.0"
"@metamask/base-controller": "npm:^4.0.0"
"@metamask/contract-metadata": "npm:^2.4.0"
"@metamask/controller-utils": "npm:^7.0.0"
"@metamask/controller-utils": "npm:^8.0.0"
"@metamask/eth-query": "npm:^4.0.0"
"@metamask/metamask-eth-abis": "npm:3.0.0"
"@metamask/network-controller": "npm:^17.0.0"
Expand All @@ -3867,7 +3867,7 @@ __metadata:
"@metamask/approval-controller": ^5.0.0
"@metamask/network-controller": ^17.0.0
"@metamask/preferences-controller": ^5.0.0
checksum: 6624b168465d6c4649577c005729a762a6e62524157b762c17426b84e4cc95bcaee05850c02bb2bb2afc930bd1976d5f106c46c6cbd08b40b35129092a084755
checksum: 78ee0bb01b0bfb9ca876ea868583b47217b51f08c7839ce45f13236c70e175edc2a1243a3c930c8c24574dd266c267fe46c85a42b377d83239084528d3361713
languageName: node
linkType: hard

Expand Down Expand Up @@ -24353,7 +24353,7 @@ __metadata:
"@metamask/address-book-controller": "npm:^3.0.0"
"@metamask/announcement-controller": "npm:^4.0.0"
"@metamask/approval-controller": "npm:^3.4.0"
"@metamask/assets-controllers": "npm:^21.0.0"
"@metamask/assets-controllers": "npm:^22.0.0"
"@metamask/auto-changelog": "npm:^2.1.0"
"@metamask/base-controller": "npm:^3.2.0"
"@metamask/browser-passworder": "npm:^4.1.0"
Expand Down

0 comments on commit e07e307

Please sign in to comment.