- {{
- $i18n.t('teleport.receiveValue', [
- amount || 0,
- currency,
- toChainLabel,
- ])
- }}
-
- {{ shortAddress(toAddress) }}
-
+
+
+ {{ $t('teleport.amount') }}
+
+
+
+
+
+ ~{{ totalFiatValue }} usd
+ {{ currency }}
+
-
+
+
+
+
+ {{ $t('general.balance') }}:{{ myBalanceWithoutDivision.toFixed(4) }}{{ currency }}
+
+ no-shadow
+ rounded
+ size="small"
+ class="ml-2"
+ @click="handleMaxClick"
+ >{{ $t('teleport.max') }}
+
+
+
+
+
-
+
diff --git a/layouts/teleport-layout.vue b/layouts/teleport-layout.vue
new file mode 100644
index 0000000000..f1f677eb6b
--- /dev/null
+++ b/layouts/teleport-layout.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
diff --git a/libs/ui/src/components/NeoButton/NeoButton.vue b/libs/ui/src/components/NeoButton/NeoButton.vue
index 9a8a698357..fe13d63b03 100644
--- a/libs/ui/src/components/NeoButton/NeoButton.vue
+++ b/libs/ui/src/components/NeoButton/NeoButton.vue
@@ -25,8 +25,8 @@
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index dca62f2e31..27eaa7e22c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -225,6 +225,9 @@ importers:
'@rollup/plugin-graphql':
specifier: ^1.1.0
version: 1.1.0(graphql@16.8.1)(rollup@2.79.1)
+ '@sentry/vite-plugin':
+ specifier: ^2.9.0
+ version: 2.9.0
'@types/jest':
specifier: ^27.5.2
version: 27.5.2
@@ -6647,6 +6650,92 @@ packages:
resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==}
dev: false
+ /@sentry-internal/tracing@7.78.0:
+ resolution: {integrity: sha512-53wf+HWyjiansZ0U+q7Q7U2kEjXfL/C8+XOwE4ntLVPGFyvxuYaRUb8OEYFNTsODf20ihnxOLZ+GsXXPlqPfFA==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@sentry/core': 7.78.0
+ '@sentry/types': 7.78.0
+ '@sentry/utils': 7.78.0
+ dev: true
+
+ /@sentry/bundler-plugin-core@2.9.0:
+ resolution: {integrity: sha512-6x8o+fjSqciFC5m8ociBTb1bKNblKdmFPXI/aef6Uzr0vvxmWR14M+cqf+fOpB8nl/OEu3jqVV6rKILEel0X2w==}
+ engines: {node: '>= 14'}
+ dependencies:
+ '@sentry/cli': 2.21.2
+ '@sentry/node': 7.78.0
+ '@sentry/utils': 7.78.0
+ dotenv: 16.3.1
+ find-up: 5.0.0
+ glob: 9.3.2
+ magic-string: 0.27.0
+ unplugin: 1.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /@sentry/cli@2.21.2:
+ resolution: {integrity: sha512-X1nye89zl+QV3FSuQDGItfM51tW9PQ7ce0TtV/12DgGgTVEgnVp5uvO3wX5XauHvulQzRPzwUL3ZK+yS5bAwCw==}
+ engines: {node: '>= 10'}
+ hasBin: true
+ requiresBuild: true
+ dependencies:
+ https-proxy-agent: 5.0.1
+ node-fetch: 2.7.0
+ progress: 2.0.3
+ proxy-from-env: 1.1.0
+ which: 2.0.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /@sentry/core@7.78.0:
+ resolution: {integrity: sha512-cf8U+1cNkIK14KC5ySXtzu4RW5Veto3lqkS95Rbl4ExUsrVsfansFNH63j6Bvu7UbJlBRK67uf6Ug2GBbUBUIg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@sentry/types': 7.78.0
+ '@sentry/utils': 7.78.0
+ dev: true
+
+ /@sentry/node@7.78.0:
+ resolution: {integrity: sha512-gCImN1McfAObOvwgHTef2RZaifcgKt8oqCmctk9MczLJOqjOSzuaigNiCwvyvioe5Eq9jqbZomO6Qx/sG+1gpQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@sentry-internal/tracing': 7.78.0
+ '@sentry/core': 7.78.0
+ '@sentry/types': 7.78.0
+ '@sentry/utils': 7.78.0
+ https-proxy-agent: 5.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@sentry/types@7.78.0:
+ resolution: {integrity: sha512-XNyu6EFTrXmKlVgKHOxGdBJ6Aw7BnMBWtptr5TPOQJ4kh+rP+4DB3I6nafcSSUbIsO+hBVgBpj0J8R3Ps86CMQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /@sentry/utils@7.78.0:
+ resolution: {integrity: sha512-vxPZaMTthMgEgKvlkuqD9rQuQ4Q8fsWAuOuzeuwUbrVCBIeM/WpmyjUUx4ozy6axNGXSXGE4CzrEQUNv3+t9kQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@sentry/types': 7.78.0
+ dev: true
+
+ /@sentry/vite-plugin@2.9.0:
+ resolution: {integrity: sha512-Hf4LcWlJy8VsH3Sw8SIB+lM+bBUJLmRUiZQPmnWZzyU33aOhREVoMdbYvTjs1aRqgD2eWXLQmtr01u0E3uYebg==}
+ engines: {node: '>= 14'}
+ dependencies:
+ '@sentry/bundler-plugin-core': 2.9.0
+ unplugin: 1.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
/@sideway/address@4.1.4:
resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==}
dependencies:
@@ -8087,12 +8176,12 @@ packages:
acorn-walk: 8.2.0
dev: true
- /acorn-jsx@5.3.2(acorn@8.10.0):
+ /acorn-jsx@5.3.2(acorn@8.11.2):
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
- acorn: 8.10.0
+ acorn: 8.11.2
/acorn-walk@7.2.0:
resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
@@ -8114,6 +8203,7 @@ packages:
resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==}
engines: {node: '>=0.4.0'}
hasBin: true
+ dev: true
/acorn@8.11.2:
resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==}
@@ -10708,8 +10798,8 @@ packages:
resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
- acorn: 8.10.0
- acorn-jsx: 5.3.2(acorn@8.10.0)
+ acorn: 8.11.2
+ acorn-jsx: 5.3.2(acorn@8.11.2)
eslint-visitor-keys: 3.4.3
/esprima@4.0.1:
@@ -11364,6 +11454,16 @@ packages:
minimatch: 5.1.6
once: 1.4.0
+ /glob@9.3.2:
+ resolution: {integrity: sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dependencies:
+ fs.realpath: 1.0.0
+ minimatch: 7.4.6
+ minipass: 4.2.8
+ path-scurry: 1.10.1
+ dev: true
+
/global-dirs@3.0.1:
resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
engines: {node: '>=10'}
@@ -13821,6 +13921,13 @@ packages:
dependencies:
brace-expansion: 2.0.1
+ /minimatch@7.4.6:
+ resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==}
+ engines: {node: '>=10'}
+ dependencies:
+ brace-expansion: 2.0.1
+ dev: true
+
/minimatch@9.0.3:
resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -13876,6 +13983,11 @@ packages:
dependencies:
yallist: 4.0.0
+ /minipass@4.2.8:
+ resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==}
+ engines: {node: '>=8'}
+ dev: true
+
/minipass@5.0.0:
resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
engines: {node: '>=8'}
@@ -15407,6 +15519,11 @@ packages:
/process-nextick-args@2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+ /progress@2.0.3:
+ resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
/promise-inflight@1.0.1:
resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==}
peerDependencies:
@@ -15449,6 +15566,10 @@ packages:
/protocols@2.0.1:
resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==}
+ /proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+ dev: true
+
/prr@1.0.1:
resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
@@ -17518,6 +17639,15 @@ packages:
- rollup
- vue
+ /unplugin@1.0.1:
+ resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==}
+ dependencies:
+ acorn: 8.11.2
+ chokidar: 3.5.3
+ webpack-sources: 3.2.3
+ webpack-virtual-modules: 0.5.0
+ dev: true
+
/unplugin@1.4.0:
resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==}
dependencies:
diff --git a/queries/subsquid/general/latestEvents.graphql b/queries/subsquid/general/latestEvents.graphql
index 4c74f7c9b0..d16b0af15a 100644
--- a/queries/subsquid/general/latestEvents.graphql
+++ b/queries/subsquid/general/latestEvents.graphql
@@ -9,6 +9,7 @@ query latestEvents(
name
price
currentOwner
+ issuer
meta {
id
name
diff --git a/queries/subsquid/ksm/latestEvents.graphql b/queries/subsquid/ksm/latestEvents.graphql
index 8be2cc51cf..d3932830a1 100644
--- a/queries/subsquid/ksm/latestEvents.graphql
+++ b/queries/subsquid/ksm/latestEvents.graphql
@@ -9,6 +9,7 @@ query latestEvents(
name
price
currentOwner
+ issuer
meta {
id
name
diff --git a/tests/e2e/createnft.spec.ts b/tests/e2e/createnft.spec.ts
new file mode 100644
index 0000000000..0ca2992bac
--- /dev/null
+++ b/tests/e2e/createnft.spec.ts
@@ -0,0 +1,93 @@
+import { expect, test } from './fixtures'
+
+test('Create NFT', async ({ page, Commands }) => {
+ await Commands.e2elogin()
+ //await page.goto('/ahk/create')
+ await page.goto('/ksm/create')
+ await page.getByTestId('create-landing-nft-button').click()
+ await expect(page).toHaveURL('/ksm/create?select=nft')
+ //Single NFT
+ await test.step('Single NFT', async () => {
+ await Commands.acceptCookies()
+ //select single nft creation
+ await page.getByTestId('create-landing-single-nft-button').click()
+ //upload NFT image
+ await page.setInputFiles(
+ 'input[type="file"]',
+ 'tests/e2e/unsplash-image.jpg',
+ )
+ //set name
+ await page
+ .getByTestId('create-nft-input-name')
+ .fill('Parametric NFT divergencies')
+ //set description
+ await page
+ .getByTestId('create-nft-input-description')
+ .fill('Testing purpose NFT description using Playwright')
+ //select AHK chain on dropdown
+ await page
+ .getByTestId('create-nft-dropdown-select')
+ .selectOption('KusamaHub')
+ await expect(page.getByTestId('chain')).toHaveText('ahk')
+ //list for sale switch
+ await page.getByTestId('create-nft-sale-switch').click()
+ //set price
+ await page.getByTestId('create-nft-input-list-value').fill('5.5')
+ //set number of copies
+ await page.getByTestId('create-nft-input-copies').fill('5')
+ await expect(
+ page.getByTestId('create-nft-input-copies-switch'),
+ ).toBeVisible()
+ //activate hastag switch
+ await page.getByTestId('create-nft-input-copies-switch').click()
+ // - - NFT attributes interactions - -
+ //open NFT attribute section
+ await page.getByTestId('create-nft-properties').click()
+ //add new attribute
+ await page.getByTestId('button-add-attribute').click()
+ //fill section
+ await page.getByTestId('attr-0').getByPlaceholder('Section').fill('BG')
+ //fill value
+ await page.getByTestId('attr-0').getByPlaceholder('Value').fill('Red')
+ //add new attribute
+ await page.getByTestId('button-add-attribute').click()
+ await page.getByTestId('attr-1').getByPlaceholder('Section').fill('Dress')
+ await page.getByTestId('attr-1').getByPlaceholder('Value').fill('Blue')
+ //remove last attribute
+ await page.getByTestId('attribute-button-remove').last().click()
+ await expect(page.getByTestId('attr-1')).not.toBeVisible()
+ //royalty
+ const royaltyFields = page
+ .getByTestId('royalty-form-input-percentage')
+ .locator('input')
+ await royaltyFields.fill('5')
+ //royalty switch
+ await page.getByTestId('royalty-form-switch').click()
+ //get user address
+ const royaltyCustom = page
+ .getByTestId('royalty-form-custom-address')
+ .locator('input')
+ await expect(royaltyCustom).toBeVisible()
+ //NSFW switch
+ await page.getByTestId('create-nft-nsfw-switch').click()
+ //deposit check
+ await expect(page.getByTestId('create-nft-deposit-amount')).toHaveText(
+ '0.0077 KSM',
+ { timeout: 30000 },
+ )
+ //preview box
+ await expect(page.getByTestId('create-nft-preview-box')).toBeVisible()
+ expect(
+ (await page.getByTestId('nft-preview-name').innerText()).valueOf(),
+ ).toBe('Parametric NFT divergencies')
+ expect(
+ (await page.getByTestId('nft-preview-price').innerText()).valueOf(),
+ ).toContain('5.5')
+ //learn more link
+ await expect(page.getByTestId('create-nft-learn-more-link')).toBeVisible()
+ await Commands.checkNewTab(
+ 'https://hello.kodadot.xyz/multi-chain/fees',
+ page.getByTestId('create-nft-learn-more-link').click(),
+ )
+ })
+})
diff --git a/tests/e2e/custom.ts b/tests/e2e/custom.ts
index a99f19d7f2..86d5710191 100644
--- a/tests/e2e/custom.ts
+++ b/tests/e2e/custom.ts
@@ -45,4 +45,11 @@ export class Commands {
async acceptCookies() {
await this.page.getByTestId('cookie-banner-button-accept').click()
}
+ async checkNewTab(url: string, clickAction) {
+ const newTabPromise = this.page.waitForEvent('popup')
+ await clickAction
+ const newTab = await newTabPromise
+ await expect(newTab).toHaveURL(url)
+ await newTab.close()
+ }
}
diff --git a/tsconfig.json b/tsconfig.json
index 440bc81593..24b85a322c 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -14,13 +14,14 @@
"experimentalDecorators": true,
"noImplicitAny": false,
"resolveJsonModule": true,
+ "verbatimModuleSyntax": false, // TODO: would be good if true
"types": [
"@nuxt/types",
"@nuxtjs/i18n",
"@nuxtjs/color-mode",
"@types/node",
"vue-apollo",
- "vitest/globals",
+ "vitest/globals"
]
},
"exclude": ["node_modules", "dist", "**/*.spec.ts"]
diff --git a/utils/chain.ts b/utils/chain.ts
index 4a776501c8..6810163521 100644
--- a/utils/chain.ts
+++ b/utils/chain.ts
@@ -43,20 +43,21 @@ export const getAvailablePrefix = (prefix: string): string => {
: ''
}
-export const availablePrefixWithIcon = () => {
- const menus = {
- ahk: '/token/kusama_asset_hub.svg',
- ahp: '/token/polkadot_asset_hub.svg',
- bsx: '/token/bsx.svg',
- snek: '/token/bsx.svg',
- ksm: '/token/ksm.svg',
- rmrk: '/token/ksm.svg',
- }
+export const chainIcons = {
+ ahk: '/token/kusama_asset_hub.svg',
+ ahp: '/token/polkadot_asset_hub.svg',
+ bsx: '/token/bsx.svg',
+ snek: '/token/bsx.svg',
+ ksm: '/token/ksm.svg',
+ rmrk: '/token/ksm.svg',
+ dot: '/token/dot.svg',
+}
+export const availablePrefixWithIcon = () => {
return availablePrefixes().map((chain) => {
return {
...chain,
- icon: menus[chain.value] || '',
+ icon: chainIcons[chain.value] || '',
}
})
}