Skip to content

Commit a3d954e

Browse files
committed
Merge branch 'main' into feat/safari-support
2 parents 664c55d + c6d81f2 commit a3d954e

98 files changed

Lines changed: 3094 additions & 2329 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
"devDependencies": {
3535
"@commitlint/cli": "^19.8.0",
3636
"@commitlint/config-conventional": "^19.8.0",
37-
"@swc/core": "^1.11.9",
37+
"@swc/core": "^1.11.21",
3838
"concurrently": "^9.1.2",
3939
"husky": "^9.1.7",
4040
"node-notifier": "^10.0.1",

packages/extension-bridge/package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,23 +44,23 @@
4444
"webextension-polyfill": "^0.12.0"
4545
},
4646
"devDependencies": {
47-
"@types/node": "^22.13.10",
47+
"@types/node": "^22.14.1",
4848
"@types/webextension-polyfill": "^0.12.3",
49-
"@typescript-eslint/eslint-plugin": "^5.62.0",
50-
"@typescript-eslint/parser": "^5.62.0",
49+
"@typescript-eslint/eslint-plugin": "^8.30.1",
50+
"@typescript-eslint/parser": "^8.30.1",
5151
"bumpp": "^10.1.0",
52-
"eslint": "^9.22.0",
52+
"eslint": "^9.24.0",
5353
"eslint-config-airbnb-base": "^15.0.0",
54-
"eslint-config-prettier": "^9.1.0",
54+
"eslint-config-prettier": "^10.1.2",
5555
"eslint-import-resolver-alias": "^1.1.2",
5656
"eslint-plugin-import": "^2.31.0",
5757
"eslint-plugin-module-resolver": "^1.5.0",
5858
"prettier": "^3.5.3",
5959
"ts-node": "^10.9.2",
6060
"tsconfig-paths": "^4.2.0",
6161
"tsup": "^8.4.0",
62-
"type-fest": "^4.37.0",
63-
"typescript": "^5.8.2",
64-
"typescript-eslint": "8.26.1"
62+
"type-fest": "^4.40.0",
63+
"typescript": "^5.8.3",
64+
"typescript-eslint": "8.30.1"
6565
}
6666
}

packages/extension/package.json

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@enkryptcom/extension",
3-
"version": "2.5.0",
3+
"version": "2.6.0",
44
"private": true,
55
"type": "module",
66
"scripts": {
@@ -24,7 +24,7 @@
2424
"watch:firefox": "yarn prebuild && cross-env BROWSER='firefox' vite"
2525
},
2626
"dependencies": {
27-
"@amplitude/analytics-browser": "^2.11.13",
27+
"@amplitude/analytics-browser": "^2.14.0",
2828
"@enkryptcom/extension-bridge": "workspace:^",
2929
"@enkryptcom/hw-wallets": "workspace:^",
3030
"@enkryptcom/keyring": "workspace:^",
@@ -41,25 +41,25 @@
4141
"@kadena/pactjs-cli": "^1.17.1",
4242
"@ledgerhq/hw-transport-webusb": "^6.29.4",
4343
"@metamask/eth-sig-util": "^8.2.0",
44-
"@metaplex-foundation/mpl-bubblegum": "^4.3.1",
45-
"@metaplex-foundation/umi": "^1.1.1",
46-
"@metaplex-foundation/umi-bundle-defaults": "^1.1.1",
47-
"@polkadot/api": "^15.8.1",
48-
"@polkadot/extension-inject": "^0.58.5",
49-
"@polkadot/keyring": "^13.4.3",
50-
"@polkadot/rpc-provider": "^15.8.1",
51-
"@polkadot/types": "^15.8.1",
52-
"@polkadot/types-known": "^15.8.1",
53-
"@polkadot/ui-shared": "^3.12.2",
54-
"@polkadot/util": "^13.4.3",
44+
"@metaplex-foundation/mpl-bubblegum": "^4.4.0",
45+
"@metaplex-foundation/umi": "^1.2.0",
46+
"@metaplex-foundation/umi-bundle-defaults": "^1.2.0",
47+
"@polkadot/api": "^15.9.2",
48+
"@polkadot/extension-inject": "^0.58.8",
49+
"@polkadot/keyring": "^13.4.4",
50+
"@polkadot/rpc-provider": "^15.9.2",
51+
"@polkadot/types": "^15.9.2",
52+
"@polkadot/types-known": "^15.9.2",
53+
"@polkadot/ui-shared": "^3.13.1",
54+
"@polkadot/util": "^13.4.4",
5555
"@polkadot/wasm-crypto": "^7.4.1",
56-
"@solana-developers/helpers": "^2.8.0",
56+
"@solana-developers/helpers": "2.8.0",
5757
"@solana/spl-token": "^0.4.13",
5858
"@solana/wallet-standard-features": "^1.3.0",
5959
"@solana/web3.js": "^1.98.0",
6060
"@wallet-standard/base": "^1.1.0",
6161
"add": "^2.0.6",
62-
"bignumber.js": "^9.1.2",
62+
"bignumber.js": "^9.2.1",
6363
"bip39": "^3.1.0",
6464
"bitcoinjs-lib": "^6.1.7",
6565
"bs58": "^6.0.0",
@@ -74,7 +74,7 @@
7474
"moment": "^2.30.1",
7575
"nanoevents": "^9.1.0",
7676
"pact-lang-api": "^4.3.6",
77-
"pinia": "^2.3.1",
77+
"pinia": "^3.0.2",
7878
"qrcode.vue": "^3.6.0",
7979
"switch-ts": "^1.1.1",
8080
"url-parse": "^1.5.10",
@@ -98,46 +98,46 @@
9898
"@rollup/plugin-replace": "^6.0.2",
9999
"@rollup/plugin-terser": "^0.4.4",
100100
"@rollup/plugin-typescript": "^12.1.2",
101-
"@tsconfig/node20": "^20.1.4",
102-
"@types/bs58": "^4.0.4",
103-
"@types/chrome": "^0.0.309",
101+
"@tsconfig/node20": "^20.1.5",
102+
"@types/bs58": "^5.0.0",
103+
"@types/chrome": "^0.0.315",
104104
"@types/ethereumjs-abi": "^0.6.5",
105105
"@types/events": "^3.0.3",
106106
"@types/fs-extra": "^11.0.4",
107107
"@types/less": "^3.0.8",
108108
"@types/lodash": "^4.17.16",
109-
"@types/node": "^22.13.10",
109+
"@types/node": "^22.14.1",
110110
"@types/url-parse": "^1.4.11",
111111
"@types/utf-8-validate": "^5.0.2",
112112
"@types/uuid": "^10.0.0",
113113
"@types/wif": "^2.0.5",
114114
"@types/zxcvbn": "^4.4.5",
115-
"@vitejs/plugin-vue": "^5.2.1",
115+
"@vitejs/plugin-vue": "^5.2.3",
116116
"@vue/eslint-config-prettier": "^10.2.0",
117117
"@vue/eslint-config-typescript": "^14.5.0",
118118
"@vue/tsconfig": "^0.7.0",
119-
"@vueuse/core": "^12.8.2",
119+
"@vueuse/core": "^13.1.0",
120120
"cross-env": "^7.0.3",
121-
"eslint": "^9.22.0",
122-
"eslint-plugin-vue": "^9.33.0",
121+
"eslint": "^9.24.0",
122+
"eslint-plugin-vue": "^10.0.0",
123123
"fs-extra": "^11.3.0",
124-
"jsdom": "^26.0.0",
125-
"less": "^4.2.2",
124+
"jsdom": "^26.1.0",
125+
"less": "^4.3.0",
126126
"less-loader": "^12.2.0",
127127
"npm-run-all2": "^7.0.2",
128128
"prettier": "^3.5.3",
129129
"rimraf": "^6.0.1",
130-
"rollup": "^4.35.0",
130+
"rollup": "^4.40.0",
131131
"rollup-plugin-visualizer": "^5.14.0",
132132
"semver": "^7.7.1",
133133
"systeminformation": "^5.25.11",
134134
"tsup": "^8.4.0",
135-
"typescript": "~5.8.2",
135+
"typescript": "~5.8.3",
136136
"url": "^0.11.4",
137-
"vite": "^6.2.1",
137+
"vite": "^6.3.1",
138138
"vite-plugin-node-polyfills": "0.23.0",
139139
"vite-tsconfig-paths": "^5.1.4",
140-
"vitest": "^3.0.8",
140+
"vitest": "^3.1.1",
141141
"vue-tsc": "^2.2.8",
142142
"webextension-polyfill": "^0.12.0"
143143
},

packages/extension/src/libs/keyring/keyring.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
HWWalletAdd,
77
KeyPairAdd,
88
KeyRecordAdd,
9+
MnemonicWithExtraWord,
910
SignerType,
1011
SignOptions,
1112
WalletType,
@@ -16,8 +17,15 @@ export class KeyRingBase {
1617
const browserStorage = new BrowserStorage(InternalStorageNamespace.keyring);
1718
this.#keyring = new KeyRing(browserStorage);
1819
}
19-
init(mnemonic: string, password: string): Promise<void> {
20-
return this.#keyring.init(password, { mnemonic });
20+
init(options: {
21+
mnemonic: string;
22+
password: string;
23+
extraWord?: string;
24+
}): Promise<void> {
25+
return this.#keyring.init(options.password, {
26+
mnemonic: options.mnemonic,
27+
extraWord: options.extraWord,
28+
});
2129
}
2230
async reset(): Promise<void> {
2331
const resetPromises = Object.values(InternalStorageNamespace).map(name =>
@@ -77,7 +85,7 @@ export class KeyRingBase {
7785
lock(): void {
7886
return this.#keyring.lock();
7987
}
80-
getMnemonic(password: string): Promise<string> {
88+
getMnemonic(password: string): Promise<MnemonicWithExtraWord> {
8189
return this.#keyring.getMnemonic(password);
8290
}
8391
isInitialized(): Promise<boolean> {
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import { NFTCollection, NFTType } from '@/types/nft';
2+
import { NodeType } from '@/types/provider';
3+
import cacheFetch from '../cache-fetch';
4+
import { NetworkNames } from '@enkryptcom/types';
5+
import { GRNFTType, GRResponse } from './types/goldrush';
6+
import imgNotFound from '@action/assets/common/not-found.jpg';
7+
const GR_ENDPOINT = 'https://partners.mewapi.io/nftsv2/';
8+
const CACHE_TTL = 60 * 1000;
9+
const getExternalURL = (network: NodeType, contract: string, id: string) => {
10+
if (network.name === NetworkNames.Gnosis)
11+
return `https://niftyfair.io/gc/asset/${contract}/${id}/`;
12+
if (network.name === NetworkNames.Matic)
13+
return `https://rarible.com/token/polygon/${contract}:${id}`;
14+
if (network.name === NetworkNames.Arbitrum)
15+
return `https://rarible.com/token/arbitrum/${contract}:${id}`;
16+
if (network.name === NetworkNames.Base)
17+
return `https://rarible.com/token/base/${contract}:${id}`;
18+
return '';
19+
};
20+
export default async (
21+
network: NodeType,
22+
address: string,
23+
): Promise<NFTCollection[]> => {
24+
const supportedNetworks = {
25+
[NetworkNames.Ethereum]: 'eth-mainnet',
26+
[NetworkNames.Matic]: 'matic-mainnet',
27+
[NetworkNames.Binance]: 'bsc-mainnet',
28+
[NetworkNames.Arbitrum]: 'arbitrum-mainnet',
29+
[NetworkNames.Optimism]: 'optimism-mainnet',
30+
[NetworkNames.Base]: 'base-mainnet',
31+
[NetworkNames.Linea]: 'linea-mainnet',
32+
[NetworkNames.Avalanche]: 'avalanche-mainnet',
33+
[NetworkNames.ZkSync]: 'zksync-mainnet',
34+
[NetworkNames.Gnosis]: 'gnosis-mainnet',
35+
[NetworkNames.Scroll]: 'scroll-mainnet',
36+
[NetworkNames.Bera]: 'berachain-mainnet',
37+
[NetworkNames.Unichain]: 'unichain-mainnet',
38+
};
39+
if (!Object.keys(supportedNetworks).includes(network.name))
40+
throw new Error('Goldrush: network not supported');
41+
let allItems: GRNFTType[] = [];
42+
const fetchAll = (): Promise<void> => {
43+
const query = `${GR_ENDPOINT}${
44+
supportedNetworks[network.name as keyof typeof supportedNetworks]
45+
}/address/${address}/balances_nft/?no-spam=true&with-uncached=true`;
46+
return cacheFetch(
47+
{
48+
url: query,
49+
},
50+
CACHE_TTL,
51+
).then(json => {
52+
const items: GRNFTType[] = (json as GRResponse).data.items;
53+
allItems = allItems.concat(items);
54+
});
55+
};
56+
await fetchAll();
57+
if (!allItems || !allItems.length) return [];
58+
const collections: Record<string, NFTCollection> = {};
59+
allItems.forEach(item => {
60+
if (
61+
!item.supports_erc.includes('erc1155') &&
62+
!item.supports_erc.includes('erc721')
63+
)
64+
return;
65+
const firstNftWithInfo = item.nft_data.find(
66+
nft =>
67+
!!nft.external_data &&
68+
!!nft.external_data.description &&
69+
!!nft.external_data.image,
70+
);
71+
if (!firstNftWithInfo) return;
72+
73+
const ret: NFTCollection = {
74+
name: item.contract_name,
75+
description: firstNftWithInfo.external_data.description,
76+
image:
77+
firstNftWithInfo.external_data.image_512 ||
78+
firstNftWithInfo.external_data.image_256 ||
79+
firstNftWithInfo.external_data.image_1024 ||
80+
firstNftWithInfo.external_data.image ||
81+
imgNotFound,
82+
contract: item.contract_address,
83+
items: item.nft_data
84+
.filter(nft => nft.external_data)
85+
.map(nft => {
86+
return {
87+
contract: item.contract_address,
88+
id: nft.token_id,
89+
image:
90+
nft.external_data.image_512 ||
91+
nft.external_data.image_256 ||
92+
nft.external_data.image_1024 ||
93+
nft.external_data.image ||
94+
imgNotFound,
95+
name: nft.external_data.name,
96+
url: getExternalURL(network, item.contract_address, nft.token_id),
97+
type: item.supports_erc.includes('erc1155')
98+
? NFTType.ERC1155
99+
: NFTType.ERC721,
100+
};
101+
}),
102+
};
103+
collections[item.contract_address] = ret;
104+
});
105+
return Object.values(collections);
106+
};

0 commit comments

Comments
 (0)