diff --git a/.github/workflows/slither.yml b/.github/workflows/slither.yml
deleted file mode 100644
index 2c841b1e436..00000000000
--- a/.github/workflows/slither.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-name: Slither Analysis
-
-on:
- workflow_dispatch:
- pull_request:
- paths:
- - "packages/protocol/**"
- push:
- branches:
- - main
-
-jobs:
- analyze:
- runs-on: [taiko-runner]
- steps:
- - uses: actions/checkout@v4
-
- - name: Install pnpm dependencies
- uses: ./.github/actions/install-pnpm-dependencies
-
- # Workaround to prevent slither-action from trying to install deps with `package.json`,
- # and since there is no lockfile it defaults `npm install` which fails because we use pnpm.
- # See: https://github.com/crytic/slither-action/issues/44#issuecomment-1931104731
- - name: Remove package.json
- run: rm packages/protocol/package.json
-
- - name: Run Slither
- uses: crytic/slither-action@v0.3.2
- id: slither
- with:
- target: packages/protocol
- sarif: results.sarif
- fail-on: config
- slither-config: packages/protocol/slither.config.json
- slither-args: --triage-database packages/protocol/slither.db.json
-
- - name: Upload SARIF file
- uses: github/codeql-action/upload-sarif@v3
- with:
- sarif_file: ${{ steps.slither.outputs.sarif }}
diff --git a/Dockerfile b/Dockerfile
index 67e3abdafea..a1d52db69d5 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,6 +1,8 @@
+ARG PACKAGE=eventindexer
+
FROM golang:1.21.0 as builder
-ARG PACKAGE=eventindexer
+ARG PACKAGE
RUN apt install git curl
@@ -12,16 +14,17 @@ COPY . .
RUN go mod download
-WORKDIR /taiko-mono/packages/$PACKAGE
+WORKDIR /taiko-mono/packages/${PACKAGE}
-RUN CGO_ENABLED=0 GOOS=linux go build -o /taiko-mono/packages/$PACKAGE/bin/${PACKAGE} /taiko-mono/packages/$PACKAGE/cmd/main.go
+RUN CGO_ENABLED=0 GOOS=linux go build -o /taiko-mono/packages/${PACKAGE}/bin/${PACKAGE} /taiko-mono/packages/${PACKAGE}/cmd/main.go
FROM alpine:latest
ARG PACKAGE
+ENV PACKAGE=${PACKAGE}
RUN apk add --no-cache ca-certificates
-COPY --from=builder /taiko-mono/packages/$PACKAGE/bin/$PACKAGE /usr/local/bin/
+COPY --from=builder /taiko-mono/packages/${PACKAGE}/bin/${PACKAGE} /usr/local/bin/
-ENTRYPOINT ["$PACKAGE"]
\ No newline at end of file
+ENTRYPOINT /usr/local/bin/${PACKAGE}
\ No newline at end of file
diff --git a/packages/bridge-ui/.env.example b/packages/bridge-ui/.env.example
index e7105a3e289..a17db647151 100644
--- a/packages/bridge-ui/.env.example
+++ b/packages/bridge-ui/.env.example
@@ -38,3 +38,7 @@ export PUBLIC_SLOW_L1_BRIDGING_WARNING=false
# Fees
export PUBLIC_FEE_MULTIPLIER=
+
+# APIs
+export MORALIS_PROJECT_ID=""
+export MORALIS_API_KEY=""
diff --git a/packages/bridge-ui/.eslintignore b/packages/bridge-ui/.eslintignore
index c26e640c61f..1c8b757654e 100644
--- a/packages/bridge-ui/.eslintignore
+++ b/packages/bridge-ui/.eslintignore
@@ -18,3 +18,5 @@ package-lock.json
yarn.lock
src/generated/*
+
+.vercel/**
diff --git a/packages/bridge-ui/.prettierignore b/packages/bridge-ui/.prettierignore
index d31e3142a9d..7f5b8674294 100644
--- a/packages/bridge-ui/.prettierignore
+++ b/packages/bridge-ui/.prettierignore
@@ -16,3 +16,4 @@ CHANGELOG.md
pnpm-lock.yaml
package-lock.json
yarn.lock
+.vercel/**
\ No newline at end of file
diff --git a/packages/bridge-ui/package.json b/packages/bridge-ui/package.json
index 646feb1efdc..50b984eab59 100644
--- a/packages/bridge-ui/package.json
+++ b/packages/bridge-ui/package.json
@@ -47,7 +47,7 @@
"prettier": "^3.2.5",
"prettier-plugin-svelte": "^3.2.3",
"svelte": "^4.2.15",
- "svelte-check": "^3.7.0",
+ "svelte-check": "^3.7.1",
"tailwindcss": "^3.4.3",
"ts-morph": "^19.0.0",
"tslib": "^2.6.2",
@@ -60,6 +60,7 @@
},
"type": "module",
"dependencies": {
+ "@moralisweb3/common-evm-utils": "^2.26.1",
"@wagmi/connectors": "^4.3.1",
"@wagmi/core": "^2.8.1",
"@walletconnect/ethereum-provider": "^2.12.2",
@@ -70,6 +71,7 @@
"buffer": "^6.0.3",
"debug": "^4.3.4",
"events": "^3.3.0",
+ "moralis": "^2.26.1",
"object-hash": "^3.0.0",
"svelte-i18n": "^4.0.0",
"viem": "^2.9.29"
diff --git a/packages/bridge-ui/src/app.config.ts b/packages/bridge-ui/src/app.config.ts
index 65fe1b198e7..364ba33e1ed 100644
--- a/packages/bridge-ui/src/app.config.ts
+++ b/packages/bridge-ui/src/app.config.ts
@@ -49,3 +49,10 @@ export const ipfsConfig = {
gatewayTimeout: 200,
overallTimeout: 5000,
};
+
+export const moralisApiConfig = {
+ limit: 10,
+ format: 'decimal',
+ excludeSpam: true,
+ mediaItems: false,
+};
diff --git a/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/ImportStep/TokenInput/TokenInput.svelte b/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/ImportStep/TokenInput/TokenInput.svelte
index 8f81bbb7da8..f70cea6767a 100644
--- a/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/ImportStep/TokenInput/TokenInput.svelte
+++ b/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/ImportStep/TokenInput/TokenInput.svelte
@@ -231,7 +231,7 @@
-
+
@@ -242,9 +242,9 @@
>{$t('recipient.label')}
{:else if showInsufficientBalanceAlert}
-
+
{:else if showInvalidTokenAlert}
-
+
{:else}
{/if}
diff --git a/packages/bridge-ui/src/components/Bridge/NFTBridgeComponents/ImportStep/ImportStep.svelte b/packages/bridge-ui/src/components/Bridge/NFTBridgeComponents/ImportStep/ImportStep.svelte
index 08d594af9aa..56a8fc13a7c 100644
--- a/packages/bridge-ui/src/components/Bridge/NFTBridgeComponents/ImportStep/ImportStep.svelte
+++ b/packages/bridge-ui/src/components/Bridge/NFTBridgeComponents/ImportStep/ImportStep.svelte
@@ -16,18 +16,26 @@
import { selectedImportMethod } from './state';
let foundNFTs: NFT[] = [];
+
+ // States
+ let scanning = false;
let canProceed = false;
export let validating = false;
- const scanForNFTs = async () => {
+ const nextPage = async () => {
+ await scanForNFTs(false);
+ };
+
+ const scanForNFTs = async (refresh: boolean) => {
scanning = true;
$selectedNFTs = [];
const accountAddress = $account?.address;
const srcChainId = $srcChain?.id;
const destChainId = $destChain?.id;
if (!accountAddress || !srcChainId || !destChainId) return;
- const nftsFromAPIs = await fetchNFTs(accountAddress, srcChainId);
+ const nftsFromAPIs = await fetchNFTs({ address: accountAddress, chainId: srcChainId, refresh });
+
foundNFTs = nftsFromAPIs.nfts;
scanning = false;
@@ -47,9 +55,6 @@
reset();
};
- // States
- let scanning = false;
-
$: canImport = ($account?.isConnected && $srcChain?.id && $destChain && !scanning) || false;
$: {
@@ -74,9 +79,9 @@
{#if $selectedImportMethod === ImportMethod.MANUAL}
{:else if $selectedImportMethod === ImportMethod.SCAN}
-
+ scanForNFTs(true)} {nextPage} bind:foundNFTs bind:canProceed />
{:else}
-
+ scanForNFTs(false)} />
{/if}
diff --git a/packages/bridge-ui/src/components/Bridge/NFTBridgeComponents/ImportStep/ScannedImport.svelte b/packages/bridge-ui/src/components/Bridge/NFTBridgeComponents/ImportStep/ScannedImport.svelte
index 3743a9a6c56..0c6e44c1490 100644
--- a/packages/bridge-ui/src/components/Bridge/NFTBridgeComponents/ImportStep/ScannedImport.svelte
+++ b/packages/bridge-ui/src/components/Bridge/NFTBridgeComponents/ImportStep/ScannedImport.svelte
@@ -6,7 +6,7 @@
import { enteredAmount, selectedNFTs, tokenBalance } from '$components/Bridge/state';
import { ImportMethod } from '$components/Bridge/types';
import { ActionButton, Button } from '$components/Button';
- import { IconFlipper } from '$components/Icon';
+ import { Icon, IconFlipper } from '$components/Icon';
import RotatingIcon from '$components/Icon/RotatingIcon.svelte';
import { NFTDisplay } from '$components/NFTs';
import { NFTView } from '$components/NFTs/types';
@@ -14,7 +14,8 @@
import { selectedImportMethod } from './state';
- export let scanForNFTs: () => Promise;
+ export let refresh: () => Promise;
+ export let nextPage: () => Promise;
export let foundNFTs: NFT[] = [];
@@ -22,12 +23,28 @@
let nftView: NFTView = NFTView.LIST;
let scanning = false;
+ let hasMoreNFTs = true;
let tokenAmountInput: TokenAmountInput;
- function onScanClick() {
+ let previousNFTs: NFT[] = [];
+ const handleNextPage = () => {
+ previousNFTs = foundNFTs;
scanning = true;
- scanForNFTs().finally(() => {
+
+ nextPage().finally(() => {
+ scanning = false;
+ });
+
+ if (previousNFTs.length === foundNFTs.length) {
+ hasMoreNFTs = false;
+ }
+ };
+
+ function onRefreshClick() {
+ scanning = true;
+ hasMoreNFTs = true;
+ refresh().finally(() => {
scanning = false;
});
}
@@ -81,7 +98,7 @@
type="neutral"
shape="circle"
class="bg-neutral rounded-full w-[28px] h-[28px] border-none"
- on:click={onScanClick}>
+ on:click={onRefreshClick}>
@@ -97,6 +114,21 @@
+
+
+
{#if nftHasAmount}
diff --git a/packages/bridge-ui/src/components/ChainSelectors/SelectorDialogs/ChainsDialog.svelte b/packages/bridge-ui/src/components/ChainSelectors/SelectorDialogs/ChainsDialog.svelte
index 2e1843a53d2..6317de54fa3 100644
--- a/packages/bridge-ui/src/components/ChainSelectors/SelectorDialogs/ChainsDialog.svelte
+++ b/packages/bridge-ui/src/components/ChainSelectors/SelectorDialogs/ChainsDialog.svelte
@@ -62,10 +62,10 @@
-